python 类中类里底层类访问修改外层类的方法

   由于某种原因需要用到类中类的结构(比如类中的某个功能要用到多进程继承类的实现),
   但是按照平常的写法会存在底层类无法访问修改外层类的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这个概念理解不深入就会出现最开始的错误.

### Python 基础常见面试题汇总 以下是常见的 Python 基础面试题及其解答: #### 1. Python 中 `__new__` 和 `__init__` 的区别是什么? Python 中的魔术方法 `__new__` 负责生成实例对象,而 `__init__` 则负责初始化这些实例对象[^2]。 具体来说: - `__new__`: 是一个静态方法,在创建新实例时被调用,返回一个新的实例。 - `__init__`: 是一个实例方法,在实例化完成后自动调用,用于设置初始属性。 ```python class MyClass: def __new__(cls, *args, **kwargs): instance = super().__new__(cls) return instance def __init__(self): self.value = 0 ``` --- #### 2. 解释一下这段代码的执行顺序:`f = a(b(c(f)))` 上述代码的执行顺序是从最内层到外层逐步展开。即先计算 `c(f)`,再将其结果传递给 `b()` 函数作为参数,最后将 `b()` 的结果传入 `a()` 函数完成整个表达式的求值过程。 --- #### 3. `os` 模块和 `sys` 模块的主要作用分别是什么? - `os` 模块主要用于处理与操作系统相关的功能,比如文件路径操作、进程管理以及环境变量读取等。它提供了访问操作系统底层接口的能力[^4]。 - `sys` 模块则主要关注于 Python 运行时环境本身的操作,例如获取命令行参数、退出程序或者修改解释器的行为等。 ```python import os print(os.getcwd()) # 获取当前工作目录 import sys print(sys.argv) # 打印脚本启动时接收的命令行参数列表 ``` --- #### 4. 如何理解 Django 请求的生命周期? 当客户端向服务器发送 HTTP 请求时,Django 将依次经历以下几个阶段来响应请求并最终返回数据给前端用户: 1. 接收来自用户的原始 Web 请求; 2. 根据 URL 配置找到对应的视图(View); 3. 如果涉及数据库查询,则通过 ORM 查询模型(Model),并与模板(Template)渲染页面内容; 4. 构建完整的 HttpResponse 对象反馈至浏览器端显示出来[^3]. --- #### 5. 关系型数据库 vs 非关系型数据库在 Django 中的表现如何比较? 对于传统的关系型数据库 (RDBMS),像 MySQL 或 PostgreSQL ,它们能够很好地支持复杂的 JOIN 操作以及其他高级 SQL 特性;而对于 NoSQL 别的非结构化存储方案而言(如 MongoDB),由于其灵活的数据模式设计使得它们可以更高效地应对大规模分布式场景下的海量半/无固定格式文档型的存取需求.因此可以说前者在这方面表现持平甚至稍逊一些,但在后者领域明显占据优势地位. --- ### 总结 以上仅列举了一些典型的 Python 及框架相关基础知识考点供参考复习之用。实际工作中还可能遇到更多深层次的技术细节探讨,请务必结合项目经验深入学习巩固理论知识!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值