Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 引用另一个类中的类实例_Python - Fatal编程技术网

Python 引用另一个类中的类实例

Python 引用另一个类中的类实例,python,Python,我正在编写有两个类的代码。one类为三维环境创建文本元素。另一个将在该环境中将它们组合在一起。我要做的是让第二个类调用第一个类的实例。换句话说,在defmakegroup中,我希望能够调用类msg的实例。编码将如何表达?目前,第一个类被继承到第二个类中,然后我尝试调用对象self.text,但我不知道应该如何引用它。我认为我没有正确地使用继承 class msg: def __init__(self,num,unit): self.message = str(num) +

我正在编写有两个类的代码。one类为三维环境创建文本元素。另一个将在该环境中将它们组合在一起。我要做的是让第二个类调用第一个类的实例。换句话说,在
defmakegroup
中,我希望能够调用
类msg
的实例。编码将如何表达?目前,第一个类被继承到第二个类中,然后我尝试调用对象self.text,但我不知道应该如何引用它。我认为我没有正确地使用继承

class msg:
    def __init__(self,num,unit):
        self.message = str(num) + ' ' + unit
        self.num = num
        self.text = viz.addText(self.message)

class msgGroup(msg):
    def __init__(self,x,y,z):
        self.msgLs=[]
        self.ghostMsg= viz.addText('',pos=[x,y,z],color= [0.000, .9, 0.071])
        self.msgLs.append(self.ghostMsg)

    def makeGroup(self):
        msg.text.setPosition([0,(len(self.msgLs)-1)*-1.5,0], viz.REL_PARENT)
        self.msgLs.append(msg.text)

不,你确实误解了继承。继承是指当B类与A类共享所有相同的财产,但有更多,也许更具体的财产时:例如一个人就是一个人

您的案例不同:您有一个组,一个组有消息。这是组合,而不是继承:“has-a”,而不是“is-a”。您只需在
msgGroup
中定义一个消息列表,并向其中添加消息,然后您就可以遍历消息并访问其
文本属性。

五件事:

  • 如果这是Python2,那么您的
    msg
    类应该继承自
    对象
  • :如果您不遵循此操作,则没有人能够遵循您的代码
  • 如果
    msgGroup
    继承自
    msg
    ,则每个
    msgGroup
    实例还具有
    msg
    实例所具有的所有成员(数据、方法和更奇特的东西)。在方法
    makeGroup
    中,要引用当前实例的
    text
    成员,只需执行
    self.text
  • 您可能希望每个
    msgGroup
    都有几个
    msg
    s。要做到这一点,不要使用继承,只要让
    msgGroup
    有一个
    msg
    s的列表,然后迭代它:

    for msg in self.msg_list:
        print msg.text
    
  • 引用对象或类的成员不称为“调用它”。您可以使用
    ()
    操作符调用函数、方法和其他可调用项(如类)

    foo = self.makeGroup # assigning makeGroup to a variable
    bar = self.makeGroup() # calling makeGroup, then assigning the result of that call to a variable
    

  • 你有问题吗?你有什么问题?看到了吗?如果我把
    msg
    s列成一个列表,那不也是
    类msg
    的一部分吗?除了在函数末尾添加类似于
    list.append(self.text)
    的内容外,还有其他方法来创建该列表吗?没有,
    msg
    s的列表将位于
    msgGroup
    类的实例中。如果您已经收集了所需的所有数据,或者可以随时获取这些数据,那么还有其他方法可以创建并向列表中添加元素,例如
    msg_list+=[无论什么]
    ,或者使用通常称为列表理解的方法,即在一条语句中创建列表的代码。@martineau中有关于它们的更多信息,
    msgGroup
    实例如果不使用其他数据结构,如何保存
    msgs
    ?您可以在自己的答案中滚动自己的链接列表-在这个答案中,高级集合使用内置集合。@user1496630否,
    msg
    s列表不会神奇地成为
    msg
    类的一部分。@Marcin抱歉,我的措辞太差了。我想问的是,如果我在
    msgGroup
    中列出一个列表,我怎么能告诉它从另一个类添加一个对象?我可以说一些“从类msg的这个实例附加这个对象”吗?