python基础知识C2

继承

实现代码的重用子类继承父类的所有方法和属性

1.继承的传递性

子类同时继承父类和父类的父类的所有属性和方法

"""
Dogs类是Animals类的子类,Animals类是Dogs类的父类,Dogs类从Animals类继承
"""
class Animals(object):

    name = "动物"

    def __init__(self):
        self.variety = "界门纲目科属种"

    def activity(self):
        print("动物都需要进食和休息")

    @staticmethod
    def fall_in_love():
        print("动物都会繁衍后代")

    @classmethod
    def competition(cls):
        print("动物之间存在复杂的食物链关系")


class Dog(Animals):
    pass

# 子类继承父类的所有属性和方法
print(Dog.name)     # 类属性继承
print(Dog().variety)# 实例属性继承
Dog().activity()    # 实例方法继承
Dog.fall_in_love()  # 静态方法继承
Dog.competition()   # 类方法继承

"""【执行结果】
动物
界门纲目科属种
动物都需要进食和休息
动物都会繁衍后代
动物之间存在复杂的食物链关系
"""

2.方法重写

class Animals(object):
    pass

class Dogs(Animals):
    def bark(self):
        print("汪汪汪")

class KeJi(Dogs):
    def bark(self):
        print("呜呜呜")

    def fly(self):
        print("飞飞飞")

no1 = KeJi()
no1.bark()
no1.fly()

3.子类调用父类的方法

super().方法名()

class Animals(object):
    def eat(self):
        print("吃骨头")

class Dogs(Animals):
    def bark(self):
        print("汪汪汪")

class KeJi(Dogs):
    def bark(self):
        print("呜呜呜")
        # 调用父类的方法
        super().bark()
        # 补充其他代码
        print("0.0 0.0")

    def fly(self):
        print("飞飞飞")

no1 = KeJi()
no1.bark()
no1.fly()

4.子类访问父类

子类【不能直接访问】父类的私有属性和私有方法

子类【可以访问】父类的公有方法,可以在【公有方法】中调用私有属性和私有方法

5.多继承

class A:
    def test01(self):
        print("爸爸A")

class B:
    def test02(self):
        print("妈妈B")

class C(A,B):
    def test03(self):
        print("孩子C")

testC = C()
testC.test01()
testC.test02()
testC.test03()
方法冲突

不同的父类,拥有相同的方法名,多继承时,会产生冲突**【尽量避免冲突】**

class A:
    def test01(self):
        print("爸爸A")

    def demo1(self):
        print("爸爸A的demo")

class B:
    def demo1(self):
        print("妈妈B的demo")

    def test01(self):
        print("妈妈B")

class C(A,B):
    def test03(self):
        print("孩子C")

testC = C()
testC.test01()
testC.demo1()
mro机制

MRO是 method resolution order ,主要用于在多继承时,判断方法属性的调用路径

__mro__  是python的内置属性,针对类专门提供的
class A:
    def test01(self):
        print("爸爸A")

    def demo1(self):
        print("爸爸A的demo")

class B:
    def demo1(self):
        print("妈妈B的demo")

    def test01(self):
        print("妈妈B")

class C(B,A):
    def test03(self):
        print("孩子C")

testC = C()
testC.test01()
testC.demo1()

# C的属性和方法的继承顺序,从左至右
print(C.__mro__)

super().init()

子类继承父类的初始化方法

class F(object):
    cls_attr = "F的类属性"

    def __init__(self):
        self.example_attr = "F的实例属性"

    @staticmethod
    def staticmethod_func():
        print("F的静态方法")

    @classmethod
    def classmethod_func(cls):
        print("F的类方法")

    def example_func(self):
        print("F的实例方法")


class S(F):

    def __init__(self,S_attr="S的实例属性"):
        self.S_attr = S_attr
        # python2.X 写为super(S,self).__init__()
        super().__init__()

print(S.__dict__)
S().example_func()# 无返回值,返回None
print(S().example_attr)
print(S().S_attr)
print(S.cls_attr)
S.classmethod_func()# 无返回值,返回None
S.staticmethod_func()# 无返回值,返回None
class F(object):
    cls_attr = "F的类属性"

    def __init__(self,name):
        self.name = name
        self.example_attr = "F的实例属性"


class S(F):

    def __init__(self,name,S_attr="S的实例属性"):
        self.S_attr = S_attr
        # python2.X 写为super(S,self).__init__()
        super(S,self).__init__(name)

f = F("147")
print(f.name)
s = S("258")
print(s.name)

执行结果

妈妈B
妈妈B的demo
# 解释器从左至右,查找对象的方法和属性
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
上帝类
class A(object):
    pass


class B:
    pass

a = A()
b = B()
print(dir(a))
print(dir(b))

python 3.x 中没有父类时,默认继承自object类

python 2.x 中没有父类时,不会继承object类

多态

不同的子类对象,调用相同的父类方法,产生不同的结果

class Dog(object):

    def __init__(self,name):
        self.name = name

    def game(self):
        print(f"{self.name}在玩耍")


class XiaoTianDog(Dog):

    def game(self):
        print(f"{self.name}翱翔天际")


class Person(object):

    def __init__(self,name):
        self.name = name

    def game_with_dog(self,dog):
        print(f"{self.name}{dog.name}在玩耍")
        print(type(dog))
        dog.game()


WangCai = Dog("旺财")
ErLangShen = Person("杨戬")
ErLangShen.game_with_dog(WangCai)

print("*"*30)
WangCai = XiaoTianDog("飞天狗")
ErLangShen = Person("杨戬")
ErLangShen.game_with_dog(WangCai)

结果

杨戬和旺财在玩耍
<class '__main__.Dog'>
旺财在玩耍
******************************
杨戬和飞天狗在玩耍
<class '__main__.XiaoTianDog'>
飞天狗翱翔天际
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值