7 __init__方法
子类继承父类,如果子类不复写父类的__init__()方法,创建子类对象时会自动调用父类__init__()方法
子类继承父类,如果子类复写的父类的__init__()方法,创建子类对象的时候不会再调用父类的__init__()方法
注意: python要求复写父类的__init__()方法时,需要调用父类__init__()
因为存在隐患,例如父类的初始化方法有参数时,子类初始化没有参数,子类再调用父类的参数的时候就会报错.
class Person(object):
def __init__(self):
print('person...')
class Student(Person):
def __init__(self):
super().__init__() #注释掉的结果是"""student..."""
print('student...')
student = Student()
"""
person...
student...
"""
8 派生属性
属性的覆盖(派生属性):子类也可以添加自己的新属性或者自己在这里重新定义的这些属性(不会影响到父类)
需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了(属性的覆盖)
class Person(object):
num = 10
def __init__(self,name)
print("person...")
class Student(Person):
num = 20
def __init__(self,name,age) #age是派生属性
super().__init__(name)
self.name = name
self.age = age
print('student...')
def eat(self):
print(super().num)
print('xxx')
"""
student = Student('zs',3)
student.eat()
print(student.name)
print(student.age)
student.eat() # xxx
print(Student.num) # 20
9 私有属性私有方法在继承中的表现
父类中的私有方法和私有属性都是不能被子类继承下来的
class Person:
num = 10
__num = 20
def __test1(self):
print('__test1')
def test2(self):
peint('person test2')
class Student(Person):
def test(self):
#print(Student.num)
#print(Student.__num1) #不能被继承下来
def test3(self):
print('tset3...')
#self.test2()
#self.__test1() #父类中的私有方法不能被继承下来
student = Student()
student.test3()
student.test2()
10 抽象类
之前我们定义了Person类实现了eat()、drink()方法,
每种人都会吃喝但是吃喝的地点不同,如果实现了方法体就浪费了。因此我们可以只定义eat()方法,不实现方法体,这种形式我们可以将方法定义为抽象方法,具有抽象方法的类就叫做抽象类。
抽象类是一个特殊的类,只能被继承,不能实例化,抽象类中可以有抽象方法和普通方法
from abc import ABCMeta, abstractmethod
# 抽象类
class Animal(metaclass=ABCMeta):
# 抽象方法
@abstractmethod
def eat(self): pass
@abstractmethod
def sleep(self): pass
# 可以定义普通的方法。
def play(self):
print('转悠...')
class Dog(Animal):
def eat(self):
print('吃狗粮...')
def sleep(self):
print('轻轻的睡觉,正如默默的看家护院')
dog = Dog()
dog.play()
11 多继承
一个子类可以继承多个父类,就是多继承,并且拥有所有父类的属性和方法。
例如 孩子会继承自己的父亲和母亲的特征。
如果子类和父类有相同的方法,就会调用子类中的方法。
注意:如果不同的父类中存在着相同的方法名称,子类对象调用的时候会调用哪个父类中的方法呢? Python会根据 MRO(method resolution order) 方法解析顺序列表进行查找。提示:开发时,需要避免这种容易产生混淆的情况!--如果父类之间存在同名的属性和方法,应尽量避免使用多继承
class A(object):
num_a = 10
def test1(self):
print('A test1')
def test2(self):
print('A test2')
class B(object):
num_b = 20
def test1(self):
print('B test1')
def test4(self):
print('B test4')
class C(A, B):
pass
# c = C()
# c.test1()
# c.test2()
# c.test3()
# c.test4()
# print(C.num_a)
# print(C.num_b)
# c.test5()
# 父类有相同的方法的时候调用哪一个父类的?
c = C()
c.test1()
print(C.mro()) # 使用 mro()方法 来查看类的搜索路径
print(C.__mro__)
---------------------
作者:weixin_44303465
来源:CSDN
原文:https://blog.csdn.net/weixin_44303465/article/details/86499251
版权声明:本文为博主原创文章,转载请附上博文链接!