Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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 2.6中,如何从类中的对象访问metod?_Python_Class - Fatal编程技术网

在python 2.6中,如何从类中的对象访问metod?

在python 2.6中,如何从类中的对象访问metod?,python,class,Python,Class,在我的代码中,我有一个包含很多函数的类和一对类(我认为是子类)。主要问题是我希望子类调用一个对象,该对象在函数init中定义,我不知道如何引用它 代码中的主要问题: class principal: def __init__(self): self.a = object() ... ... class secondary(threading.Thread): def __init__(self): a.proceed()

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

代码中的主要问题:

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

...
    class secondary(threading.Thread):
        def __init__(self):
            a.proceed() # problem !!!
我试图调用一个类似的主体。a.procedure(),但回溯告诉我: AttributeError:类主体没有属性“a”


我怎样才能解决这个问题。似乎这是一个很容易解决的问题,但我看不出来。

您必须在
中为
次要对象实例化一个主体对象

p = principal()
然后引用一个对象

pa = p.a()
pa.proceed()
请注意,我的变量名称非常可怕


还要注意的是,您不是子类化
principal
,而是子类化
threading.Thread
。缩进是不够的,您必须在类定义中包含超类

与Java不同,对于
主体
的每个实例,都不会有新的
主体.secondary
类。在Python中,当您在另一个类(classeption:P)中声明一个类时,这只意味着内部类将作为外部类的class属性进行访问,仅此而已。因此,没有可从
principal.secondary
方法访问的
principal
的外部实例

实际上,您希望在Python中做一些毫无意义的事情。我建议你用别的方法做你想做的任何事。例如,您可以获取
principal
的实例,并将其作为
principal.secondary的构造函数的参数传递:

p = principal()
s = principal.secondary(p)
另外,请注意,
principal.secondary
不是
principal
的子类,而是类中的一个类。“子类”是从另一个类扩展/继承的类。因此,
principal.secondary
threading.Thread
的子类,而不是来自principal

最后,有两个离题的建议:如果你的类没有扩展任何其他类,那么一定要让你的类扩展
object
,然后用大写字母开始你的类名称:

class Principal(object):
    ...
编辑:如果您真的希望将类绑定到Java中的实例(我怀疑您是否希望),那么有一种方法可以模拟它。创建接收对象作为参数的函数,声明并返回类:

def generateSecondary(outerObject):
    class Secondary(object):
        def __init__(self):
            outerObject.proceed()
    return Secondary
outerObject
参数将绑定到函数内声明的类

现在,声明您的
主体
类。调用
Principal
\uuuu init\uuuu
方法中的
generateSecondary()
函数,将初始化对象作为参数传递,并将其设置为初始化对象的属性:

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>
>>主体=主体()
>>>secondary=principal.secondary()
属性
>>>次要的

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

有很多原因(包括Python的民间期望它),考虑“类主体(对象)”…类上的大写名称,并派生自'object'@Jubeor:您来自Java背景吗?当然,请注意Python中的嵌套类不会像Java中那样自动绑定到周围类的实例。必须在构造函数中显式传递实例。