说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
类的继承也是一个非常有用的设计,我们在新定义类时,如果它属于之前定义过类的一部分,则可以继承父类的特性。
基本方法如下:
class ClassName(Base1, Base2, Base3):
pass
括号里的类名为父类,会继承父类(支持一到多个)里的所有属性和方法。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
在之前类的定义中我们定义一个学生(Student)类,我们现在需要一个大学生的类,它也是学生,可以继承学生类:
class Student(object):
"""这是一个学生类"""
def __init__(self, name):
self.name = name
def say(self):
print(f'我的名字是:{self.name}')
def add(self, x, y):
print(f'这个加法我会,等于{x+y}')
class CollegeStudent(Student):
def practice(self):
print(f'我是{self.name}, 在世界500强实习。')
我们来实例化使用一下:
lily = CollegeStudent('lily') # 实例化
lily.say() # Student 得到了继承
# 我的名字是:lily
lily.practice() # 调用它自己的方法
# 我是lily, 在世界500强实习。
如果所继承的父类的方法无法满足使用,可以进行重写,这个过程叫方法的覆盖(override)。如上例中 Student
类的 say
方法不能满足,我们可以重写:
class CollegeStudent(Student):
def say(self):
print(f'大家好!我的名字是:{self.name}')
我们调用时,使用了我们重写的方法逻辑:
lily.say()
# 大家好!我的名字是:lily
super() 函数是用于调用父类(超类)的一个方法,语法是:super(type[, object-or-type])
。super(SubClass, self).method()
的意思是,根据 self 去找 SubClass 的「父亲」,然后调用这个「父亲」的 method()。经常用在我们在子类中重写了父类中的方法,但有时候还是需要用父类中的方法。
class Student(object):
"""这是一个学生类"""
def __init__(self, name):
self.name = name
def say(self):
print(f'我的名字是:{self.name}')
def add(self, x, y):
print(f'这个加法我会,等于{x+y}')
class CollegeStudent(Student):
def practice(self):
super().say()
super(CollegeStudent, self).add(1,5)
执行如下:
lily = CollegeStudent('lily')
lily.practice()
'''
我的名字是:lily
这个加法我会,等于6
'''
如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
MRO (Method Resolution Order):python 对于每一个类都有一个 MRO 列表,此表的生成有以下原则:子类永远在父类之前,如果有多个父类,那么按照它们在列表中的顺序被检查,如果下一个类有两个合法的选择,那么就只选择第一个。参考
类中的属性和方法有可继承性(inheritable versus)与不可继承属性(non-inheritable)之说,如果不希望其他类来继承,可以在命名变量名和函数名时用双下划线开头:
class Father:
def __init__(self, money, house):
self.money = money
self.house = house
# 私有属性
self.__girl_friend = "Cuihua"
def operating_company(self):
print("李氏集团业绩平稳上升")
# 私有方法
def __love(self):
print(f"父亲年轻时与{self.__girl_friend}谈恋爱")
试着继续父亲的类(Father),然后调用相关属性和方法试试?这些私有函数的作用范围仅在当前类,其表象上可以被重写,但实际上并无重写的效果。
除了对自己定义的方法进行重写,还可以对内置方法进行重写,如 __init__ ( self [,args...] )
构造函数, 调用方法 obj = className(args)
。
更多的内容可以查看Python的内置类属性。
更新时间:2022-02-19 14:26:52 标签:python 类