总结:
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_()