# 在这个模块中我们学习了python中类的定义,使用,继承,多继承,super函数的使用。已经有的基础是C++的类的基础。
class father():
# 1.请注意,初始化函数的名称是__init__,它的第一个参数永远是self(也可以是其他名称,但建议使用self),后面的参数则是用来初始化对象的,这和C++中的方式不同,后者需要单独把参数写出来,但是Pyton中仅仅需要写方法就可以,
# 所有的参数都放在__init__函数中进行定义和初始化(在一条语句中执行)
def __init__(self,site):
self.name="wgy"
self.age=48
self.wife="wy"
self.location=site
self.surname="Wu"
# 2. 在类中定义的函数如果想要使用类中的属性,则需要传参 self,并且通过 self.attribute_name的方式来调用指定的参数
def what_to_say(self):
print("I am father\n")
def what_to_do(self):
print("I am a father I like to play with my son\n")
def father_getting_old(self,age):
self.age=age
if age>60:
print("I am getting old\n")
else:
print("I am still young\n")
print("I am %d years old\n"%self.age)
# 3. 在python的继承中,仅仅可以通过 Son_class_name(Father_class_name)的方式来指明继承哪个类
class son(father):
def __init__(self, site):
super().__init__("cemetery")
self.name = "litle_wgy"
super().what_to_do()
self.age = 1
self.wife = "unknown"
self.location = site
def what_to_say(self):
print("I am son,not father\n")
# 4.super函数的原理
# 应用场景==>super函数是类中默认定义的函数,主要有两个作用,1=>在单继承体系中,指代父类,提升代码的可阅读性;2=>在多继承体系中,解决多继承的方法冲突问题,比如调用__init__函数的时候。
# 使用方法=>super函数接受两个参数,第一个参数是当前类的类名,第二个参数是当前类的对象,一般为self。super函数的使用格式如下:super(A,self),如果不传入参数默认传入当前类和当前类的对象(self)。
# 实现原理=>super函数的实现原理在于通过类中默认的MRO序列来找寻方法调用。MRO序列是一个列表,列表中的元素是类,列表中的第一个元素是当前类,第二个元素是当前类的父类,第三个元素是当前类的父类的父类,以此类推。
# 代码案例1=>在上述的son例子中,直接通过super就可以指代父类。
# 代码案例2=>下面将举例在多继承体系中,super函数的使用,两个例子分别是多继承子类初始化时super的使用,和多继承子类中调用父类方法调用时super的使用。
# 5.多继承子类初始化时super的使用
class nBase(object):
def __init__(self):
print("enter Base")
print("leave Base")
class nA(nBase):
def __init__(self):
print("enter A")
nBase.__init__(self) #调用父类的构造函数进行初始化
print("leave A")
class nB(nBase):
def __init__(self):
print("enter B")
nBase.__init__(self) #调用父类的构造函数进行初始化
print("leave B")
class nC(nA,nB):
def __init__(self):
print("enter C")
nA.__init__(self) #调用父类A的构造函数进行初始化
nB.__init__(self) #调用父类B的构造函数进行初始化
print("leave C")
#下面版本是使用super函数的版本,用法是初始化,和调用方法。
class Base(object):
def __init__(self):
print("enter Base")
print("leave Base")
def curr_func(self):
print("this is Base")
class A(Base):
def __init__(self):
print("enter A")
super(A,self).__init__()
print("leave A")
def curr_func(self):
print("this is A ,froward to C,then to B")
class B(Base):
def __init__(self):
print("enter B")
super(B,self).__init__()
print("leave B")
def curr_func(self):
print("this is B ,froward to A,then to Base")
class C(A,B):
def __init__(self):
print("enter C")
super(C,self).__init__()
print("leave C")
def curr_func(self):
print("this is c ,no froward,then to A,then to B,then to Base")
def use_a_func(self):
print("in C,use A's func")
super(C,self).curr_func()
def use_b_func(self):
print("in C,use B's func")
super(A,self).curr_func()
def use_base_func(self):
print("in C,use Base's func")
super(B,self).curr_func()
c=C()
c.use_a_func()
c.use_b_func()
c.use_base_func()
# 类中自动维护的mro序列为C->A->B->Base->object,super函数的使用是通过mro序列来找到下一个类,然后调用该类的方法,联级调用初始化函数,这样就可以解决多继承的方法冲突问题。
# 可参考的文章:https://blog.csdn.net/wo198711203217/article/details/84097274 ,https://huaweicloud.csdn.net/63802f3adacf622b8df86428.html?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-1-116173195-blog-84097274.235%5Ev38%5Epc_relevant_sort_base1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Eactivity-1-116173195-blog-84097274.235%5Ev38%5Epc_relevant_sort_base1&utm_relevant_index=1
# 可参考的文章:https://docs.python.org/3/library/functions.html?highlight=super#super
Ch9-python中类的入门使用和super()的使用
于 2023-07-22 16:34:46 首次发布