如何在python 2.6中从类中的对象访问方法?

时间:2011-07-12 13:46:51

标签: python class

在我的代码中,我有一个包含很多函数和一对类的类(我认为是子类)。主要的问题是我希望子类调用一个对象,在函数 init 中定义,我不知道如何引用它

代码中的主要问题:

class principal:
    def __init__(self):
        self.a = object()
...

...
    class secondary(threading.Thread):
        def __init__(self):
            a.proceed() # problem !!!

我试过调用类似principal.a.proceed()但是Traceback告诉我:     AttributeError:类principal没有属性'a'

我该如何解决这个问题。它似乎很容易解决,但我看不到它。

2 个答案:

答案 0 :(得分:1)

您必须在__init__ secondary中实例化主体对象

p = principal()

然后引用一个对象

pa = p.a()
pa.proceed()

请注意,我的变量名称是可怕的

另请注意,您不是principal的子类,而是继承threading.Thread。缩进是不够的,你必须在类定义中包含超类

答案 1 :(得分:1)

与Java不同,principal.secondary的每个实例都不会有新的principal类。当你在Python中的另一个类(classeption:P)中声明一个类时,它只意味着内部类将作为外部类的类属性和 nothing 进行访问。因此,principal方法无法访问principal.secondary的外部实例。

的确,你想在Python中做一些毫无意义的事情。我建议你通过其他方式做任何你想做的事情。例如,您可以获取principal的实例并将其作为principal.secondary的构造函数的参数传递:

p = principal()
s = principal.secondary(p)

另请注意,principal.secondary不是principal的子类,而只是类中的类。 “子类”是从另一个扩展/继承的类。因此,principal.secondarythreading.Thread的子类,而不是来自本人。

最后,两个小的偏离主题的建议:如果它不扩展任何其他类,则始终使您的类扩展object并通过以大写字母开始类的名称来跟随PEP-8

class Principal(object):
    ...

编辑:如果确实希望将类绑定到像Java这样的实例(我怀疑你想要),有一种方法可以模拟它。创建一个接收对象作为参数的函数,声明并返回类:

def generateSecondary(outerObject):
    class Secondary(object):
        def __init__(self):
            outerObject.proceed()
    return Secondary

outerObject参数将绑定到函数内声明的类。

现在,宣布你的Principal课程。在generateSecondary() __init__方法中调用Principal函数,将初始化对象作为参数传递,并将其设置为初始化对象的属性:

class Principal(object):
    def __init__(self):
        self.attribute = "an attribute of %s" % self
        self.Secondary = generateSecondary(self)

    def proceed(self):
        print self.attribute

结果是:

>>> principal = Principal()
>>> secondary = principal.Secondary()
an attribute of <classeption.Principal object at 0x2e3970>
>>> secondary
<classeption.Secondary object at 0x2e3a10>

这是可能的,因为Python类是可以绑定到闭包的第一类对象(在传统意义上的“闭包”)。我不建议使用此类代码,但有一种方法可以执行您要求的 - 这可能不是您所需要的