繁体   English   中英

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

[英]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类的实例并调用cuic的嵌套函数的成员,因为物理 MVP 有两个系统,称为CUIC电气连接到它。

所以,而不是打电话

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.cumvp.ic调用属于CUIC函数,而不是编写mvp.ic_set_target_temperature等,以便在MVP类中没有一堆函数。

提前致谢

我用chepner的提示解决了:

我把班级分成四个班级:

  • EvoSer:是否与串行运动进行所有通信
  • MVP:实现了一些cuic经常用到的功能
  • 每个系统的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM