Python从内部类访问外部类的self

Python从内部类访问外部类的self,python,class,nested,Python,Class,Nested,我试图在Python的外部类中嵌套一个内部类,以便在调用内部类的函数时获得更好的结构 因此,我有一个python文件,其中包含以下内容,称为mvpSerial.py: import struct from numpy import uint32 class MVP: def __init__(self): self.__ser = self.__mvp_connect() return def __new__(cls): r

我试图在Python的外部类中嵌套一个内部类,以便在调用内部类的函数时获得更好的结构

因此,我有一个python文件,其中包含以下内容,称为
mvpSerial.py

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()
import mvpSerial

mvp = mvpSerial.MVP()

mvp.cu.pump_set_pwm(35)
mvp.ic.set_target_temperature(43)
但是当我执行代码时,我得到以下错误:

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'
回溯(最近一次呼叫最后一次):
文件“C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python ce\helpers\pydev\pydevd.py”,第1434行,在_exec中
pydev_imports.execfile(文件、全局、局部)#执行脚本
文件“C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.3\plugins\python ce\helpers\pydev\\u pydev\u imps\\u pydev\u execfile.py”,第18行,在execfile中
exec(编译(内容+“\n”,文件,'exec'),全局,loc)
文件“C:/Users/User/Documents/GitHub/qc python/qc_main.py”,第11行,在
mvp.cu.泵组pwm()
TypeError:pump_set_pwm()缺少1个必需的位置参数:“self”
OO语言对我来说是新的,因为到目前为止我只在微控制器上编程过C。 我不需要是嵌套类,我只想调用属于
CU
IC
over
mvp.CU
mvp.IC
的函数,而不是编写
mvp.IC\u set\u target\u temperature
等,从而在
mvp
类中没有一堆函数


提前感谢

我用切普纳的提示解决了问题:

我把这个班分成四个班:

  • EvoSer:所有与串行运动的通信
  • MVP:实现
    cu
    ic
    经常使用的一些功能
  • 每个系统的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类的新实例时,它从调用init 唤起者:

并创建CU和IC的实例

有了这些,我可以写:

mvp.cu.pump_set_pwm()
import mvpSerial

mvp = mvpSerial.MVP()

mvp.cu.pump_set_pwm(35)
mvp.ic.set_target_temperature(43)

我用
chepner
的提示解决了这个问题:

我把这个班分成四个班:

  • EvoSer:所有与串行运动的通信
  • MVP:实现
    cu
    ic
    经常使用的一些功能
  • 每个系统的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类的新实例时,它从调用init 唤起者:

并创建CU和IC的实例

有了这些,我可以写:

mvp.cu.pump_set_pwm()
import mvpSerial

mvp = mvpSerial.MVP()

mvp.cu.pump_set_pwm(35)
mvp.ic.set_target_temperature(43)

内部类在Python中并不常见。为
MVP
之外的组件定义类,并将这些类的实例存储在
MVP
的实例中。不过,内部类只是围绕可能只是函数的方法的不必要包装。内部类在Python中并不常见。为
MVP
之外的组件定义类,并将这些类的实例存储在
MVP
的实例中。不过,您的内部类只是围绕可能只是函数的方法的不必要包装。