20201221-1 类的继承1

面向对象三大特性:
封装
继承
# 动物包含所有的动物,动物又包含会飞的不会飞的,飞禽走兽等
# 不同的动物都能吃喝拉撒睡
# 大类已经包含吃喝拉撒,小类就不需要包含了
多态

class People:

    def __init__(self,name,age):
        self.name = name    
        # 等号两边的 name 变量名可以不一致,比如 self.NAme = name; name 是(self,name,age)中的参数名,NAme 是赋的变量名
        self.age = age

    def eat(self):
        print("%s is eating..."%self.name)
    def talk(self):
        print("%s is talking..."%self.name)
    def sleep(self):
        print("%s is sleeping..."%self.name)
    
# 现在需要写一个子类,子类是男人
# Man 需要继承父类
# 继承后,里面什么也不写也没关系
class Man(People):
    pass

# 实例化
m1 = Man()   
--->
TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'
需要传名字才可以,因为是继承了的
1-1
class People:

    def __init__(self,name,age):
        self.name = name    
        # 等号两边的 name 变量名可以不一致,比如 self.NAme = name; name 是(self,name,age)中的参数名,NAme 是赋的变量名
        self.age = age

    def eat(self):
        print("%s is eating..."%self.name)
    def talk(self):
        print("%s is talking..."%self.name)
    def sleep(self):
        print("%s is sleeping..."%self.name)
    
# 现在需要写一个子类,子类是男人
# Man 需要继承父类
# 继承后,里面什么也不写也没关系
class Man(People):
    pass

# 实例化
m1 = Man("NiuHanYang",222)  
# 调用
m1.eat()
--->
NiuHanYang is eating...

Man直接继承了父类的方法
1-2
可以写一些自己的方法吗?
class People:

    def __init__(self,name,age):
        self.name = name    
        # 等号两边的 name 变量名可以不一致,比如 self.NAme = name; name 是(self,name,age)中的参数名,NAme 是赋的变量名
        self.age = age

    def eat(self):
        print("%s is eating..."%self.name)
    def talk(self):
        print("%s is talking..."%self.name)
    def sleep(self):
        print("%s is sleeping..."%self.name)
    
# 现在需要写一个子类,子类是男人
# Man 需要继承父类
# 继承后,里面什么也不写也没关系
class Man(People):
    def piao(self):
        print("%s is piaoing.....20s......done."%self.name)

m1 = Man("NiuHanYang",222)  
m1.eat()
m1.piao()
--->
NiuHanYang is eating...
NiuHanYang is piaoing.....20s......done.
1-3-1
可以重构父类方法吗?比如增加新功能
class People:

    def __init__(self,name,age):
        self.name = name    
        # 等号两边的 name 变量名可以不一致,比如 self.NAme = name; name 是(self,name,age)中的参数名,NAme 是赋的变量名
        self.age = age

    def eat(self):
        print("%s is eating..."%self.name)
    def talk(self):
        print("%s is talking..."%self.name)
    def sleep(self):
        print("%s is sleeping..."%self.name)
    
class Man(People):
    def piao(self):
        print("%s is piaoing.....20s......done."%self.name)

    def sleep(self):
        print("man is sleeping")

m1 = Man("NiuHanYang",222)  
m1.eat()
m1.piao()
m1.sleep()
--->
NiuHanYang is eating...
NiuHanYang is piaoing.....20s......done.
man is sleeping

父类的没有执行,被覆盖了
1-3-2
但是,这里想要的是增加新功能
class People:

    def __init__(self,name,age):
        self.name = name    
        # 等号两边的 name 变量名可以不一致,比如 self.NAme = name; name 是(self,name,age)中的参数名,NAme 是赋的变量名
        self.age = age

    def eat(self):
        print("%s is eating..."%self.name)
    def talk(self):
        print("%s is talking..."%self.name)
    def sleep(self):
        print("%s is sleeping..."%self.name)
    
class Man(People):
    def piao(self):
        print("%s is piaoing.....20s......done."%self.name)

    def sleep(self):
        People.sleep(self)      
        print("man is sleeping")

m1 = Man("NiuHanYang",222)  
m1.eat()
m1.piao()
m1.sleep()
--->
NiuHanYang is eating...
NiuHanYang is piaoing.....20s......done.
NiuHanYang is sleeping...
man is sleeping

直接调用父类方法,然后将self自己传进去,父类方法就执行了
这就等于重构了父类方法
1-4-1
再写一个类
class People:

    def __init__(self,name,age):
        self.name = name    
        # 等号两边的 name 变量名可以不一致,比如 self.NAme = name; name 是(self,name,age)中的参数名,NAme 是赋的变量名
        self.age = age

    def eat(self):
        print("%s is eating..."%self.name)
    def talk(self):
        print("%s is talking..."%self.name)
    def sleep(self):
        print("%s is sleeping..."%self.name)
    
class Man(People):
    def piao(self):
        print("%s is piaoing.....20s......done."%self.name)
    def sleep(self):
        People.sleep(self)      
        print("man is sleeping")

class Woman(People):
    def get_birth(self):
        print("%s is born a baby...."%self.name)
        
m1 = Man("NiuHanYang",222)  
m1.eat()
m1.piao()
m1.sleep()

w1 = Woman("ChenRonghua",26)
w1.get_birth()
--->
NiuHanYang is eating...
NiuHanYang is piaoing.....20s......done.
NiuHanYang is sleeping...
man is sleeping
ChenRonghua is born a baby....
1-4-2
Man 和 Woman 都 继承了 People
既然都属于同一个父类,Woman 可以调用 Man 中的 piao 吗?

class People:

    def __init__(self,name,age):
        self.name = name    
        # 等号两边的 name 变量名可以不一致,比如 self.NAme = name; name 是(self,name,age)中的参数名,NAme 是赋的变量名
        self.age = age

    def eat(self):
        print("%s is eating..."%self.name)
    def talk(self):
        print("%s is talking..."%self.name)
    def sleep(self):
        print("%s is sleeping..."%self.name)
    
class Man(People):
    def piao(self):
        print("%s is piaoing.....20s......done."%self.name)
    def sleep(self):
        People.sleep(self)      
        print("man is sleeping")

class Woman(People):
    def get_birth(self):
        print("%s is born a baby...."%self.name)
        
m1 = Man("NiuHanYang",222)  
m1.eat()
m1.piao()
m1.sleep()

w1 = Woman("ChenRonghua",26)
w1.get_birth()
w1.piao()
--->
AttributeError: 'Woman' object has no attribute 'piao'

男女不同的地方,所以才弄出两个子类,所以 Woman 是不可以调用 Man 的
就是因为有不同,所以才分别继承了父类
原文地址:https://www.cnblogs.com/azxsdcv/p/14167500.html