Ch9-python中类的入门使用和super()的使用

# 在这个模块中我们学习了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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值