在我的代码中,我有一个包含很多函数和一对类的类(我认为是子类)。主要的问题是我希望子类调用一个对象,在函数 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'
我该如何解决这个问题。它似乎很容易解决,但我看不到它。
答案 0 :(得分:1)
您必须在__init__
1>的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.secondary
是threading.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类是可以绑定到闭包的第一类对象(在传统意义上的“闭包”)。我不建议使用此类代码,但有一种方法可以执行您要求的 - 这可能不是您所需要的。