Python系统学习第十一课

受保护的封装 protected

  • 讲对象成员进行一定级别的封装,然后在类中或者子类中部可以进行访问,但是在外部不可以
  • 封装方法:在成员前添加一个下划线就可以

公有的 public

  • 谁都可以用

继承

  • 继承就是一个类可以获得另一个类的成员属性和成员方法
  • 作用:减小代码,增加代码的复用功能(很值得琢磨,深功夫),同时可以设置类与类直接的关系
  • 继承与被继承的概念:
    • 被继承的类叫父类或者基类
    • 用于继承的类叫子类也叫派生类
    • 继承与被继承的关系一定存在一个is - a关系
#继承的语法
#实际上在python中,任何类都有一个共同的父类叫object
class Person():
    name = "None"
    age = 0
    def sleep(self):
        print("i am sleeping")
        
class Teacher(Person):
    pass

A = Teacher()   #继承了父类的所有属性
print(A.name)
print(Teacher.name)
A.sleep()
    
None
None
i am sleeping

继承的特征

  • 所有的类都继承自object类,所有的类都是object的子类
  • 子类一旦继承父类就可以使用父类中除私有成员外的所有内容
  • 子类继承父类以后并没有将父类成员完全复制到子类中,而是通过引用关系访问调用
  • 子类可以定义独有的成员属性和方法
  • 子类中定义的成员和父类成员如果相同,则优先使用子类成员
  • 子类如果想扩充父类的方法,可以在定义新方法的同时访问父类成员来进行代码重用,可以使用 父类名.父类成员 的格式来调用父类成员,也可以使用super().父类成员的格式来调用
class Person():
    name = "None"
    _age = 0
    __addr = "zhangjiakou"
    def sleep(self):
        print("i am sleeping")
        
class Teacher(Person):
    teacherID = "33317S153643"
    def test(self):
        print("i am teacher")

A = Teacher()   #继承了父类的所有属性
print(A.name)   #可以访问
print(A._age)   #可以访问
#print(A.__addr)   #不可访问
print(A.teacherID)
A.test()

None
0
33317S153643
i am teacher
class Person():
    name = "lizi"
class Teacher(Person):
    name = "llll"
    
A  = Teacher()
print(A.name)   #子类和父类重名使用就近原则
llll

继承变量函数的查找顺序问题

  • 优先查找自己的变量
  • 没有则查找父类
  • 构造函数如果本类中没有定义,则自动查找父类构造函数
  • 如果本类有定义,则不再继续向上查找

构造函数

  • 是一类特殊的函数,在类进行实例化之前进行调用
  • 如果定义了构造函数,则实例化时使用构造函数,不查找父类构造函数
  • 如果没定义,就查找父类构造函数
  • 如果子类没定义构造函数,则构造对象时参数就按照父类的构造函数的参数构造
class Dog():
    def __init__(self):   #构造函数,每次实例化的时候第一个被调用,因为主要工作是进行初始化,所以得名构造函数
        print("i am dog")
        
d = Dog()   #实例化的时候,括号内的参数需要和构造函数参数相匹配
        
i am dog
#继承中的构造函数
class Animal():
    def __init__(self):
        print("animal")

class PaXingAnimal(Animal):
    def __init__(self):
        print("paxingdongwu")

class Dog(PaXingAnimal):
    def __init__(self):  
        print("i am dog")
        
benben = Dog()  #实例化的时候调用了Dog的构造函数,调用的是子类的构造函数,不是调用的弗雷德构造函数

class Cat(PaXingAnimal):
    pass
C = Cat()   #此时自动调用构造函数,子类没有构造函数,就向上查找,查找父类的构造函数
i am dog
paxingdongwu
class Animal():
    def __init__(self):
        print("animal")

class PaXingAnimal(Animal):
    def __init__(self, name):     #此时有了参数,name
        print("paxingdongwu {0}".format(name))

class Dog(PaXingAnimal):
    def __init__(self):  
        print("i am dog")
        
benben = Dog()  

class Cat(PaXingAnimal):
    pass
C = Cat()   #由于Cat没有构造函数,就向上查找,因为PaXingAnimal的构造函数需要两个参数,实例化的时候就给了一个,报错
i am dog



---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-22-bd7db85ae48b> in <module>()
     15 class Cat(PaXingAnimal):
     16     pass
---> 17 C = Cat()   #由于Cat没有构造函数,就向上查找,因为PaXingAnimal的构造函数需要两个参数,实例化的时候就给了一个,报错


TypeError: __init__() missing 1 required positional argument: 'name'
class Animal():
    def __init__(self):
        print("animal")

class PaXingAnimal(Animal):
    def __init__(self, name):     #此时有了参数,name
        print("paxingdongwu {0}".format(name))

class Dog(PaXingAnimal):
    def __init__(self):  
        print("i am dog")
        
benben = Dog()  

class Cat(PaXingAnimal):
    pass
C = Cat("benben")    #此时可以运行通过
i am dog
paxingdongwu benben

super

  • 不是关键字,而是一个类
  • super和父类没有任何实质性关系,但是通过super可以调用父类
  • super().类名

猜你喜欢

转载自blog.csdn.net/qq_42633819/article/details/85692201