python自动化21期day6

一、面向对象初识

  python中一切皆对象。
  类有两种:
    新式类:在py3中所有类都是新式类
    经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类

class Person:
    country = "中国"  # 静态属性

    def __init__(self, name, age, sex):  # 初始化对象  在实例化时自动将对象/实例本身传给__init__的第一个参数。
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):  # 动态属性或方法
        return "%s在吃饭" % self.name

# 访问类的属性
print(Person.country)
print(Person.__dict__)  # 查看类具有的属性和方法

# 实例化 实例化会自动执行__init__方法,可以用它来为每个实例对象定制自己的特征
spf = Person("spf", 18, "")  # 类名() 就等于在执行Person.__init__(),执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。

# 访问类的属性和方法
print(Person.eat(spf))
print(spf.eat())
声明类和属性的查询与执行
class Person:
    def __init__(self, name, sex, hp, dps, bag=[]):
        """
        人的特性
        :param name:  昵称
        :param sex: 年龄
        :param hp: 血量
        :param dps: 攻击力
        :param bag: 背包
        """
        self.name = name
        self.sex = sex
        self.hp = hp
        self.dps = dps
        self.bag = bag

    def hit(self, dog):
        """
        方法:人打狗
        :param dog: 实例化的狗
        :return:
        """
        dog.hp -= self.dps
        print("Info:{0}打了{1},{1}掉了{2}血,剩余{3}血".format(self.name, dog.name, self.dps, dog.hp))

class Dog:
    def __init__(self, name, kind, hp, dps):
        """
        人的特性
        :param name:  昵称
        :param kind: 品种
        :param hp: 血量
        :param dps: 攻击力
        """
        self.name = name
        self.kind = kind
        self.hp = hp
        self.dps = dps

    def hit(self, person):
        """
        方法:狗咬人
        :param person: 实例化后的人
        :return:
        """
        person.hp -= self.dps
        print("Info:{0}咬了{1},{1}掉了{2}血,剩余{3}血".format(self.name, person.name, self.dps, person.hp))


alex = Person("金角大王", "", 5000, 300)
hsq = Dog("旺财", "哈士奇", 50000, 500)

alex.hit(hsq)  # Info:金角大王打了旺财,旺财掉了300血,剩余49700血
hsq.hit(alex)  # Info:旺财咬了金角大王,金角大王掉了500血,剩余4500血

print(alex.hp)  # 4500
print(hsq.hp)  # 47900
示例:人狗大战
from math import pi
class Yuan:
    def __init__(self,r):
        """
        圆的属性
        :param r: 半径
        """
        self.r = r
    def mj(self):
        """
        求圆面积方法
        :return: 圆面积
        """
        return pi * self.r ** 2
    def zj(self):
        """
        求圆的周长
        :return: 圆周长
        """
        return 2 * pi * self.r
yuna1 = Yuan(5)
print(yuna1.mj())
示例:求圆面积

二、面向对象命名空间

  创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
    静态属性就是直接在类中定义的变量
    动态属性就是定义在类中的方法
  创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
    在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

class Person:
    person = ""  # 静态属性,也可以叫公共属性
    name = "wxx"  # 当init对象命名空间中没有name的时候会找类命名空间中的name
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
p1 = Person("spf", 18, "")
print(p1.name)

三、面向对象的组合

  组合的定义:在一个类中以另外一个类的对象作为数据属性,称为类的组合

  用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,例如:人有武器

# 人狗大战,给人增加武器
class Person:
    def __init__(self, name, sex, hp, dps, bag=[]):
        """
        人的特性
        :param name:  昵称
        :param sex: 年龄
        :param hp: 血量
        :param dps: 攻击力
        :param bag: 背包
        """
        self.name = name
        self.sex = sex
        self.hp = hp
        self.dps = dps
        self.bag = bag

    def hit(self, dog):
        """
        方法:人打狗
        :param dog: 实例化的狗
        :return:
        """
        dog.hp -= self.dps
        print("Info:{0}打了{1},{1}掉了{2}血,剩余{3}血".format(self.name, dog.name, self.dps, dog.hp))

class Dog:
    def __init__(self, name, kind, hp, dps):
        """
        人的特性
        :param name:  昵称
        :param kind: 品种
        :param hp: 血量
        :param dps: 攻击力
        """
        self.name = name
        self.kind = kind
        self.hp = hp
        self.dps = dps

    def hit(self, person):
        """
        方法:狗咬人
        :param person: 实例化后的人
        :return:
        """
        person.hp -= self.dps
        print("Info:{0}咬了{1},{1}掉了{2}血,剩余{3}血".format(self.name, person.name, self.dps, person.hp))

class Wuqi:
    def __init__(self, name, dps, price):
        """
        武器的属性
        :param name: 名称
        :param dps: 攻击力
        :param price: 价格
        """
        self.name = name
        self.dps = dps
        self.price = price
    def baozi(self,dog):
        """
        武器:毒包子
        :param dog:  狗对象
        :return:
        """
        dog.hp -= self.dps
        print("%s吃了%s掉了%s血剩余%s血" % (dog.name, self.name, self.dps, dog.hp))


roubaozi = Wuqi("肉包子", 5000, 3000)  # 实例化一个Wuqi对象roubaozi
alex = Person("金角大王", "", 5000, 300, [5000])  # 实例化一个Person对象alex
hsq = Dog("旺财", "哈士奇", 50000, 500)  # 实例化一个Dog对象hsq

if alex.bag[0] >= roubaozi.price:  # 判断alex的钱够不够买武器
    alex.wuqi = roubaozi  # 给alex添加一个武器
    alex.wuqi.baozi(hsq)  # alex使用武器
人狗大战,给人增加武器
# 求圆环面积和周长
from math import pi
class Yuan:
    """
    圆面积和圆周长
    """
    def __init__(self,r):
        """
        圆的属性
        :param r: 半径
        """
        self.r = r
    def mj(self):
        """
        求圆面积方法
        :return: 圆面积
        """
        return pi * self.r ** 2
    def zj(self):
        """
        求圆的周长
        :return: 圆周长
        """
        return 2 * pi * self.r

class Yuanhuan:
    """
    圆环的面积和周长
    """
    def __init__(self, outer_r, inner_r):
        """
        圆环的属性
        :param outer_r: 大圆的半径
        :param inner_r: 小圆的半径
        """
        self.outer = Yuan(outer_r)  # outer = 实例化的圆对象
        self.inner = Yuan(inner_r)  # inner = 实例化的圆对象
    def yh_mj(self):
        """
        求圆环的面积,大圆-小圆
        :return:
        """
        # 圆对象有mj方法
        return self.outer.mj() - self.inner.mj()  
    def yh_zc(self):
        """
        求圆环的周长
        :return:
        """
        # 圆对象有zc方法
        return self.outer.zj() + self.inner.zj()

yh1 = Yuanhuan(10, 5)  # 实例化圆环
print(yh1.yh_mj()) # 求圆环面积
print(yh1.yh_zc()) # 求圆环周长
求圆环的面积和周长

四、面向对象的三大特性

  1、继承

    继承的定义:继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
    继承的作用:1、减少代码的重用 2、提高代码可读性 3、规范编程模式
    抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
    继承:子类继承了父类的方法和属性
    派生:子类在父类方法和属性的基础上产生了新的方法和属性

    继承顺序:

      经典类:深度优先

      新式类:广度优先

扫描二维码关注公众号,回复: 902550 查看本文章
# 人和狗都属于动物
class Animal:
    def __init__(self, name, hp, dps):
        """
        动物的属性
        :param name: 昵称
        :param hp: 血量
        :param dps: 攻击力
        """
        self.name = name
        self.hp = hp
        self.dps = dps

    def hit(self,argv):
        argv.hp -= self.dps
        print("Info:{0}打了{1},{1}掉了{2}血,剩余{3}血".format(self.name, argv.name, self.dps, argv.hp))

class Person(Animal):
    def __init__(self, name, sex, hp, dps, bag=[]):
        """
        人的特性
        :param name:  昵称
        :param sex: 年龄
        :param hp: 血量
        :param dps: 攻击力
        :param bag: 背包
        """
        # Animal.__init__(name, hp, dps)
        super().__init__(name, hp, dps)
        self.sex = sex
        self.bag = bag


class Dog(Animal):
    def __init__(self, name, kind, hp, dps):
        """
        人的特性
        :param name:  昵称
        :param kind: 品种
        :param hp: 血量
        :param dps: 攻击力
        """
        super().__init__(name, hp, dps)
        self.kind = kind


alex = Person("金角大王", "", 5000, 300)
hsq = Dog("旺财", "哈士奇", 50000, 500)

alex.hit(hsq)  # Info:金角大王打了旺财,旺财掉了300血,剩余49700血
hsq.hit(alex)  # Info:旺财咬了金角大王,金角大王掉了500血,剩余4500血

print(alex.hp)  # 4500
print(hsq.hp)  # 47900
人狗大战,继承动物类
class A:
    def func(self):
        print("in A")
class B(A):  # 单继承
    def func(self):
        print("in B")
class C(A):
    def func(self):
        print("in C")
class D(B, C):  #  多继承
    def func(self):
        print("in D")
print(D.__bases__)
print(D.mro())  # 查看类的继承顺序  [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
钻石继承
# 在python3中,子类执行父类的方法也可以直接用super方法.
class A:
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex
    def func(self):
        print("in A")
class B(A):
    def __init__(self, name, sex, add):
        # A.__init__(name,sex)
        super().__init__(name, sex)  # 支持父类的属性
        self.add = add
    def func(self):
        super().func() # 执行父类的方法
obj = B("spf","","HN")
obj.func()
print(obj.__dict__)
super

  2、多态

  3、封装

猜你喜欢

转载自www.cnblogs.com/spf21/p/9035495.html