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

2024-05-20 17:33:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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类的实例,并调用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。 我不需要是嵌套类,我只想调用属于CUIC的函数,而不是编写mvp.ic_set_target_temperature等,以便在MVP类中没有一堆函数

提前谢谢


Tags: 文件函数pyselftargetreturndefset
1条回答
网友
1楼 · 发布于 2024-05-20 17:33:34

我用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类的新实例时,它从调用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)

相关问题 更多 >