python(二)的面向对象---继承

总结:
  • 如果一个对象与另一个对象有一定的关系, 那么一个对象可用是另外一个对象的属性
  • 在类里一个变量, 没有self. 就只是个局部变量
私有属性和私有方法
class Animal: 
    def __init__(self):        
        # 在属性前加两个下划线,就变成了私有属性 ,外面的对象无法直接调用        
        # 在类里面 可以用self调用        
        self.__age = 0        
        self.name = 'dahuang'    
    def set_age(self, age):        
        if 1 <= age < 20:            
            self.__age = age
        else:            
            print('岁数出错')    
    def get_age(self):  
        print(self.__age)
        
dog =  Animal()
dog.set_age(15)
# print(dog.__age)
dog.get_age()


# 禁止使用
        # 私有属性, 本质 就是修改了名字 _类名私有属性名    _Anima__age

继承以及单继承
1. 程序中的继承
  • 在程序中, 继承描述的是多个类之间的所属关系
  • 一个类A里面的属性和方法可以通过继承的方法,传递到类B里
  • 那么类A就是基类 , 也叫父类, 类B就是派生类也叫子类
# 父类
class A:
    def __init__(self):
        self.num = 10
        
    def print_num(self):
        print(self.num + 10)

# 子类
class B(A):
    pass
    
b = B()
print(b.num)
b.print_num()

单继承: 子类只继承一个父类
# 定义一个Master类       Master   精通 ,  大师的意思
class Master:
    def  __init__(self):
        print("-----Master----init---")
        
    def  yyz(self):
        print("发出一招-------一阳指")

# 定义 prentice类     继承了 Master
class Apprentice(Master):
    pass
    
   wukong = Apprentice()   # 创建子类实例对象 
   wukong.yyz()     # 调用方法一阳指
总结:
  • 子类在继承的时候,在定义类时,小括号()中为父类的名字
  • 父类的属性、方法,会被继承给子类
  • 只有一个父类的继承,叫做单继承
class Master:
    def  __init__(self):
        print("-----Master----init---")
        
    def yyz(self):
        print("发出一招------ 一阳指")
        
class person(Master):
    def gpqgb(self):
        print("发出一招, --------龟派气功波")
wukong = person()
wukong.yyz()
wukong.gpqgb()

        

注意 子类可以调用自己创建的方法,也可以调用父类的方法

多层继承
class Master:
    def  __init__(self):
        print("-----Master----init---")
        
    def yyz(self):
        print("发出一招------ 一阳指")
        
# 定义preson类, 继承了 Master        
class Person(Master):
    def gpqgb(self):
        print("发出一招, --------龟派气功波")
        
# 定义了Person1类, 继承了Person        
class Person1(Person):
    pass
wukong = Person1()
wukong.yyz()
wukong.gpqgb()

总结: 可以多层继承, 子类还可以有子类

继承 : 重写
class Master:
    def  __init__(self):
        print("-----Master----init---")
        
    def yyz(self):
        print("发出一招------ 一阳指")
        
# 定义preson类, 继承了 Master        
class Person(Master):
    def gpqgb(self):
        print("发出一招, --------龟派气功波")
        
# 定义了Person1类, 继承了Person        
class Person1(Person):
    def gpqgb(self):
        print("发出一招, --------龟派气功波升级版")
    def yyz(self):
        print("发出一招------ 一阳指升级版")   
wukong = Person1()
wukong.yyz()
wukong.gpqgb()

总结

  • 子类写的方法和父类重名,就是对父类方法的重写
  • 重写后,子类调用方法,就会执行自己方法里的内容
在子类调用父类的方法

总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b33KX6gt-1573050111601)(en-resource://database/411:1)]

语法

1.父类类名.方法名(self)
2.super(子类类名,self).方法名()
3.super().方法名()  这种用的比较多

注意

  • 调用父类的方法 父类如果没有会再去父类的父类里找
子类继承父类属性
  • 属性也像方法一样可以被继承使用

# 定义一个Master类      master精通, 大师的意思class Master:
    def __init__(self):
        self.name = '少林派'
        print('---Master--init---')

    def yyz(self):
        print("发出一招-----一阳指")


# 定义Prentice类,继承了 Masterclass Apprentice(Master):

    def tzst(self):
        print("发出一招-----弹指神通")


# 定义ApprenticeApprentice类,继承了 Apprenticeclass ApprenticeApprentice(Apprentice):
    pass


# 实例化ApprenticeApprentice对象 给oubu
oubu = ApprenticeApprentice()
print(oubu.name)

注意 l
类不能调用实例属性
无法使用self

继承: 私有属性和方法能否继承

# 定义一个Master类      master精通, 大师的意思
class Master:
    def __init__(self):
        self.__name = '哈哈派'
        print('---Master--init---')

    def yyz(self):
        print("发出一招-----一阳指")

    def __khbd(self):
        print('使用-葵花宝典')


# 定义Prentice类,继承了 Master
class Apprentice(Master):

    def tzst(self):
        print("发出一招-----弹指神通")


# 定义ApprenticeApprentice类,继承了 Apprentice
class ApprenticeApprentice(Apprentice):
    def say(self):
        print(super().__name)
        print(super().__khbd())


# 实例化ApprenticeApprentice对象 给oubu
oubu = ApprenticeApprentice()

# print(oubu.__name) #报错
# print(oubu.__khbd()) #报错
oubu.say()     #---Master--init---
                # 1
                # 哈哈派
                # 使用-葵花宝典
                # 3
                # 4   
  • 结论: 私有方法和私有属性无法被继承
多继承: 子类继承多个父类
说明
  • 多继承可以继承多个父类, 也继承了所有父类的属性和方法
# 定义一个Master类      master精通, 大师的意思
class Master:
    def __init__(self):
        self.name = '哈哈派'
        print('---Master--init---')

    def yyz(self):
        print("发出一招-----一阳指")

    def fyzb(self):
        print("轻功---飞檐走壁-少林派")


# celestial [səˈlestʃl] 神仙,仙人
class Celestial:
    def __init__(self):
        # 属性
        self.name = "龟仙派"

    # 实例方法
    def qigong(self):
        print("发出一招...龟派气功")

    def fyzb(self):
        print("轻功---飞檐走壁-龟仙派")


# 定义Prentice类,继承了 Master 和Celestial 继承多个类 用逗号分开
class Apprentice(Master, Celestial):

    def tzst(self):
        print("发出一招-----弹指神通")


wukong = Apprentice()
wukong.fyzb()
# 类的__mro__属性 获取的顺序 就是类的对象调用属性查找的顺序2
print(Apprentice.__mro__)  # (<class '__main__.Apprentice'>, <class '__main__.Master'>, <class '__main__.Celestial'>, <class 'object'>)

注意

  • 如果多个父类中有同名的属性和方法, 则默认使用第一个父类的属性和方法(根据魔法属性mro的顺序来查找)
  • mro()
  • 多个父类中, 不重名的属性和方法, 不会有任何影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值