2019最新《JAVA编程实战教程 办公自动化OA项目实例》

 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 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/lijiajia888/article/details/87878041