[英]Python access self of outer class from inner class
我试图在 Python 的外部类中嵌套一个内部类,以便在调用内部类的函数时获得更好的结构。
所以我有一个名为mvpSerial.py
具有以下内容的 python 文件:
import struct
from numpy import uint32
class MVP:
def __init__(self):
self.__ser = self.__mvp_connect()
return
def __new__(cls):
return super(MVP, cls).__new__(cls)
def __mvp_connect(self):
"""Tries to connect to any
connected prototype and return serial object"""
print("Looking for MVP on all COM Ports....");
# ...
return serialObject
def __evo_mvp_transfer(self, cmd, major=0, minor=0, data=0, tries=5):
# do something with serial object of self
# and return bytearray full of data
self.__ser.write(data)
return self.__ser.read(self.__ser.in_waiting)
class cu(object):
def pump_set_pwm(self, duty):
self.outer.__evo_mvp_transfer(1, 24, 4, uint32(duty))
class ic:
def set_target_temperature(self, target):
self.__evo_mvp_transfer(1, 36, 4, float(target))
我在另一个文件中导入这个文件:
import mvpSerial
mvp = mvpSerial.MVP()
mvp.cu.pump_set_pwm(35)
mvp.ic.set_target_temperature(43)
在这个文件中,我想创建一个MVP
类的实例并调用cu
和ic
的嵌套函数的成员,因为物理 MVP 有两个系统,称为CU
和IC
电气连接到它。
所以,而不是打电话
mvp.cu_pump_set_pwm()
我想将类 'mvp' 划分为 'cu' 和 'ic' 以获得更好、更清晰的真实物理世界结构并编写:
mvp.cu.pump_set_pwm()
但是当我执行代码时,我收到以下错误:
Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python-ce\helpers\pydev\pydevd.py", line 1434, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "C:/Users/User/Documents/GitHub/qc-python/QC_main.py", line 11, in <module>
mvp.cu.pump_set_pwm()
TypeError: pump_set_pwm() missing 1 required positional argument: 'self'
OO 语言对我来说是新的,因为到目前为止我只在微控制器上编程过 C。 我不需要嵌套类,我只想通过mvp.cu
和mvp.ic
调用属于CU
或IC
函数,而不是编写mvp.ic_set_target_temperature
等,以便在MVP
类中没有一堆函数。
提前致谢
我用chepner
的提示解决了:
我把班级分成四个班级:
cu
和ic
经常用到的功能MVP、CU 和 IC 是 EvoSer 的子类,因此继承了 EvoSer 的所有功能:
class EvoSer:
def __init__(self, ser=None):
if ser is None:
self.__ser = None
self.mvp_connect()
else:
self.__ser = ser
def __evo_mvp_transfer(self, cmd, major=0, minor=0, data=0, tries=5):
# do something with serial object of self
# and return bytearray full of data
self.__ser.write(data)
return self.__ser.read(self.__ser.in_waiting)
当创建类 MVP 的新实例时,它会从 EvoSer 调用 init:
class MVP(EvoSer):
def __init__(self):
super().__init__()
self.cu = CU(self._EvoSer__ser)
self.ic = IC(self._EvoSer__ser)
def __new__(cls):
return super(MVP, cls).__new__(cls)
并且还创建了 CU 和 IC 的实例。
有了这个,我可以写:
import mvpSerial
mvp = mvpSerial.MVP()
mvp.cu.pump_set_pwm(35)
mvp.ic.set_target_temperature(43)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.