Python 面向对象
  X5zJxoD00Cah 2023年11月02日 39 0

总结:

1

继承

函数名相同 子覆盖父

当子类和父类方法同名时,子类方法会覆盖父类的方法。

(属性= 变量  方法= 函数() )

https://cloud.tencent.com/developer/article/1915788

函数名相同 类内运行还是调用类本身的函数 不会父类调用子类相同名的函数(方法)

# 类继承
class Class_1():
    i = 0
    def __init__(self, i= i):
        self.i = i+ 1
class Class_2(Class_1):
    def fun_2(self):
        self.i += 1
class Class_3(Class_2):
    def fun_3(self):
        self.i += 1
# 实例化
obj_ = Class_3()
obj_.fun_2()
obj_.fun_3()
obj_.i
'''在子类中设置修改变量入口'''
class Class_1():
    i = 0 # 对父类和子类都管用
    j = 0 # 对父管用 对子不管用
    def __init__(self, i= i): # 因为构造函数中默认调用i
        self.i = i+ 1
class Class_2(Class_1):
    j = 2
    def fun_2(self, j= j):
        self.i += 1 # 从父类继承
        self.j = j # 在子类生成, 可修改

# 实例化 并且运行子类函数
obj_ = Class_2()
obj_.fun_2()

# 不修改默认参数
print("i", obj_.i)
print("j", obj_.j)

# 在子类函数中 修改子类默认参数j
obj_.fun_2(3)
print("修改后j", obj_.j)

# 实例化 并且运行子类函数
# 在父类构造函数中 修改父类默认参数i
obj_ = Class_2(i= 1)
obj_.fun_2()
print("修改后i", obj_.i)
'''i, j, z'''

class Class_1():
    i = 0 # 对父类和子类都管用
    j = 0 # 对父管用 对子不管用
    z = 0 # 对父管用, 对子不管用    
    def __init__(self, i= i): # 因为构造函数中默认调用i
        self.i = i
        self.j = self.j
        print("父类i,j:", self.i, self.j)

class Class_2(Class_1):
    z = 2
    def fun_2(self, z= z):
        print(self.i) # 从父类继承, 在父类构造函数修改
        print(self.j) # 从父类继承, 不可修改
        
        self.z = z # 不加此语句 直接从z = 2 中调用 不可修改z值; 加此语句 可在子类函数中修改变量z
        print(self.z) # 在子类生成, 在子类函数修改 (不加self.z = z 直接从z = 2 中调用 不可修改z值)

# 实例化 并且运行子类函数
obj_ = Class_2()
obj_.fun_2()

obj_ = Class_2(100)
obj_.fun_2(200)
'''从父类中继承属性 并且可在子类方法中修改'''

class Class_1():
    def __init__(self, i= 1):
        self.i = i
    def fun_1(self):
        self.j = self.i

class Class_2(Class_1):
    def fun_2(self, j= 2):
        # 从父类中继承j
        print("j", self.j)
        # 可在子类方法中修改j
        self.j = j
        print("j", self.j)

obj_ = Class_2()
obj_.fun_1() # 此步不可省略(除非构造方法中自动运行该方法)
obj_.fun_2()
'''子类可生成构造方法吗 可以 但是父类就不能有构造方法了'''

class Class_1():
    def fun_1(self, i= 1):
        self.i = i
        print("i", self.i)

class Class_2(Class_1):
    def __init__(self):
        self.fun_1()

obj_ = Class_2()
'''从父类方法中继承属性作为子类属性的默认值 不行'''
class Class_1():
    def fun_1(self):
        self.i = 1
        
class Class_2(Class_1):
    def fun_2(self, j= '必须手动写入'):
        self.j = j
        print(self.j)
        
obj_ = Class_2()
obj_.fun_1()
obj_.fun_2(j= obj_.i) # 必须手动写入

'''子类属性的默认值必须从子类的类属性中生成'''
class Class_1():
    def fun_1(self):
        self.i = 1
        
class Class_2(Class_1):
    j = 1
    def fun_2(self, j= j): # 
        self.j = j
        print(self.j)
        
obj_ = Class_2()
obj_.fun_1()
obj_.fun_2() # 默认值从子类的类属性中生成
obj_.fun_2(j= obj_.i) # 也可以手动写入

2

使用构造方法自动调用实例方法 使得实例化时直接执行实例方法

实例方法汇总多个独立方法 有先后顺序

吐槽:

51CTO博客的一些问题:

找不到或联系不上客服 群里发了也不回复信息

代码块有bug 有的内容会被吞掉 目前发现的是 有的注释会莫名被吞掉 即使更新保存后也是如此

首页缺乏bug反馈入口

class Class_():
    
    '''构造方法'''
    def __init__(self):
        
        # 自动调用 实例方法
        self.fun_()
        print("自动调用构造函数")
        
    
    '''实例方法'''
    def fun_(self):
        
        # 测试 独立运行 是否有先后顺序
        self.fun_1()
        self.fun_2()
        print("fun_ :(a, b):", (self.a, self.b))
    
    
    def fun_1(self):
        
        self.a = 1
        print("fun_1: a:", self.a)
    
    
    def fun_2(self):
        
        self.b = self.a + 1
        print("fun_2: b:", self.b)


# 测试结果: 独立运行 有先后顺序
# 经验: __init__左右两边各两个下划线别漏了
obj_ = Class_()
class Class_():
    
    '''构造方法'''
    def __init__(self):
        
        # 自动调用 实例方法        
        print("自动调用构造函数\n")
        self.fun_()
        print("构造方法运行完毕")
        
    
    '''实例方法'''
    def fun_(self):
        
        # 测试 独立运行 是否有先后顺序
        print("  fun_被调用\n")
        self.fun_1()
        self.fun_2()
        print("  fun_运行完毕\n")
    
    
    def fun_1(self):
        
        print("    fun_1被调用")
        self.a = 1
        print("    fun_1: a:", self.a, '\n')
    
    
    def fun_2(self):
        
        print("    fun_2被调用")
        self.b = self.a + 1
        print("    fun_2: b:", self.b, '\n')


# 测试结果: 独立运行 有先后顺序
# 经验: __init__左右两边各两个下划线别漏了
if __name__ == '__main__':
    obj_ = Class_()
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

X5zJxoD00Cah