Python 探究类的继承的使用

继承的概念
在现实生活中,继承一般指的是子女继承父辈的财产。那么在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中可以描述为猫和狗都继承自动物。同理,波斯猫和家猫都继承自猫。而斑点狗,泰迪都继承之狗。程序中当我们定义一个class的时候,可以从某个现有的class继承,新的class称之为子类(Subclass),而被继承的class称之为基类、父类或超类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。


单继承

class DerivedClassName(BaseClassName):  # 可以继承多个基类,从左到右开始
<statement-1>
.
<statement-N>

需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,
Python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。

#类定义
class People:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print(f"{self.name}说,你今年{self.age}岁了,体重是{self.__weight}")
#单继承示例
class Student(People):  # 继承People类
    grade = ''
    def __init__(self,n,a,w,g):
        people.__init__(self,n,a,w)  # 调用父类方法
        # super(Student,self).__init__(n,a,w)  # 也可以这么调用父类
        # super().__init__(n,a,w)  # 也可以这么调用父类
        self.grade = g  # 比父类多了一个变量
        print(f"我上{self.grade}年级了", end=",")
stu = Student("张三", 10, 120, 20)
stu.speak()  # 我上20年级了,张三说,你今年10岁了,体重是120

如果在子类中写和父类一样的函数,调用的时候调用的是子类还是父类呢?

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
        #单继承示例
class Student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
        #覆写父类的方法
    def speak(self):
        print(f"{self.name}说: 我 {self.age} 岁。我的年级是{self.grade}" )
p = Student("zhangsan", 20, 150, 10)
p.speak()  # zhangsan说: 我 20 岁。我的年级是10

从上面的代码不难看出,调用的是子类的函数,也就是相当于将父类的方法进行重写


多重继承

class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
<statement-N>
class A (object):
    grade = 100
    def __init__(self):
        self.grade = 20
        print(f"得分为{self.grade}")
class B (object):
    name = "张三"
    def __init__(self):
        self.name = "张三"
        print(f"他的名字叫{self.name}")      
class C (A,B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)
        print(f"{self.name}得了{self.grade}")
c = C()

"""
得分为20
他的名字叫张三
张三得了20
"""

继承理论上就是减少代码量哦


方法重写

class Parent: # 定义父类
    def myMethod(self):
        print ('调用父类方法')
class Child(Parent): # 定义子类
    def myMethod(self):
        print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法,使用super时,括号内使用的参数是本类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值