Python:新式类写法,多继承

新式类写法:

经典类:不由任意内置类型派生出的类:

class A:

class Person:#父类
    def eat(self):
        print("eat")
class Man(Person):#子类
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")

class A():也属于经典类

class A(object(对象,Python为所有对象提供的基类,提供一些内置的属性和方法,所有类都继承,如果一个类没有继承任何类,默认继承object类))  新式类:继承了object类或者该类的子类都是新式类,推荐使用

print(dir(object))

结果:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

多继承:子类可以有多个父类,可以继承所有父类的属性和方法:

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person,Person1):
    pass
son=Son()
son.eat()
son.sing()

不同的父类存在同名的方法:开发时尽量避免这种情况:

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def eat(self):
        print("eat1")#不会被继承
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person,Person1):
    pass
son=Son()
son.eat()
son.sing()

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def eat(self):
        print("eat1")#会被继承,因为Son类调用符合就近原则,Person1最近则被优先调用
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person1,Person):
    pass
son=Son()
son.eat()
son.sing()

方法的搜索顺序(了解):__mro__:

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def eat(self):
        print("eat1")
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person1,Person):
    pass
son=Son()
son.eat()
son.sing()
print(Son.__mro__)

结果为:
eat1
sing
(<class '__main__.Son'>, <class '__main__.Person1'>, <class '__main__.Person'2>, <class 'object'>)

搜索方法时会先按照__mro__的输出结果从左往右的顺序查找,如果在当前类中找到方法就会直接运行不会搜索,没找到会报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值