由于某种原因需要用到类中类的结构(比如类中的某个功能要用到多进程继承类的实现),
但是按照平常的写法会存在底层类无法访问修改外层类的self里的变量的情况
(底层类继承外层类仅能实现获得值,不能修改外层类的值).
class Mother: # 外层类
def __init__(self):
self.x = 0
self.run()
def run(self):
s = self.Son()
s.gai()
class Son: # 底层类
def __init__(self):
self.y = self.x # 这里是想要获得外层类的self.x的值,但是这样写不行.
# 写成self.self.x/Mother.self.x都不行
def gai(self):
print("底层类的变量值",self.y)
print("外层类的变量值",self.x)
self.x = 1 # 这里是想要更改外层类的self.x的值,但是这样写不行
self.y = 1
print("底层类的变量值",self.y)
print("外层类的变量值",self.x)
m = Mother()
运行后报错:AttributeError: ‘Son’ object has no attribute ‘x’/AttributeError: ‘Son’ object has no attribute ‘self’/AttributeError: type object ‘Mother’ has no attribute ‘self’
于是做出代码改为:
class Mother: # 外层类
def __init__(self):
self.x = 0
self.run()
def run(self):
s = self.Son(self)
s.gai()
self.p() # 外层类的x值已修改
def p(self):
print(self.x)
class Son: # 底层类
def __init__(self, m_self):
self.y = m_self.x
self.m_self = m_self
def gai(self):
print("底层类的变量值", self.y)
print("外层类的变量值", self.m_self.x)
self.y = 1 # 更改底层类的self.x的值
self.m_self.x = 1 # 更改外层类的self.x的值
print("底层类的变量值", self.y)
print("外层类的变量值", self.m_self.x)
m = Mother()
运行结果为:
底层类的变量值 0
外层类的变量值 0
底层类的变量值 1
外层类的变量值 1
1
成功实现类中类的底层类对外层类的访问和修改.
原理其实是把外层类的self当做变量传进来,如果对self这个概念理解不深入就会出现最开始的错误.