在python 2.6中,如何从类中的对象访问metod?
在我的代码中,我有一个包含很多函数的类和一对类(我认为是子类)。主要问题是我希望子类调用一个对象,该对象在函数init中定义,我不知道如何引用它 代码中的主要问题:在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()
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中那样自动绑定到周围类的实例。必须在构造函数中显式传递实例。