Python在类定义中实例化类

2024-09-29 19:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个变量添加到一个类中,该类包含该类的实例。下面是我代码的简短版本。在

class Classy :
    def __init__(self) :
        self.hi = "HI!"
    # "CLASSIES" variable holds instances of class "Classy"
    CLASSIES = []
    for i in xrange(0,4) :
        CLASSIES.append(Classy())

运行代码时,我得到以下错误。在

^{pr2}$

有没有其他方法可以将类的实例添加到该类中的类/静态变量中?在


Tags: ofinstances实例代码self版本initdef
3条回答

类主体在创建类之前执行。因此,您正在尝试在类存在之前实例化它。您仍然可以将实例附加到类,但必须在类主体完成后创建它们,例如:

class Classy(object):
    def __init__(self):
        self.hi = "HI!"
    CLASSIES = []

for i in xrange(4):
    Classy.CLASSIES.append(Classy())

但是,我建议您首先仔细考虑是否需要这个有效的全局列表,以及是否需要它成为类对象的一部分。就我个人而言,我几乎从来没有做过这样的事。在

最简单的方法是在创建类之后,在定义了类之后执行此操作,因此可以使用:

class Classy :
    CLASSIES = []

    def __init__(self) :
        self.hi = "HI!"

Classy.CLASSIES = [Classy() for _ in xrange(0,4)]

(为了方便起见,这里使用list comprehension,因为这是构建列表的最可读和最有效的方法)。在

还请注意,如果这是一个常量,那么您可能应该将其设置为元组而不是列表,如果不打算这样做,您可能不应该使用ALL_CAPS名称,该名称按惯例意味着常量。在

在我看来,你想要的是:

class Classy :
    CLASSIES = []
    def __init__(self) :
        self.hi = "HI!"
        Classy.CLASSIES.append(self)

for i in xrange(4):
    Classy()

for x in  Classy.CLASSIES:
    print x

结果

^{pr2}$

编辑

请注意,对于Lattyware代码:

class Classy :
    CLASSIES = []
    idC = id(CLASSIES)
    def __init__(self) :
        self.hi = "HI!"
        #Classy.CLASSIES.append(self)


Classy.CLASSIES = [Classy() for _ in xrange(0,4)]

print Classy.idC
print id(Classy.CLASSIES)
print 'Classy.idC==id(Classy.CLASSIES) :',Classy.idC==id(Classy.CLASSIES)

结果

18713576
10755928
Classy.idC==id(Classy.CLASSIES) : False

而对于delnan'code的for循环,它不会出现。在

但是很容易纠正:
写作
Classy.CLASSIES[:] = [Classy() for _ in xrange(0,4)]

Classy.CLASSIES.extend(Classy() for _ in xrange(0,4))
而不是
Classy.CLASSIES = [Classy() for _ in xrange(0,4)]
这取决于你想要什么。在

编辑2

Methods may reference global names in the same way as ordinary functions. The global scope associated with a method is the module containing its definition. (A class is never used as a global scope.)

http://docs.python.org/2/tutorial/classes.html#class-definition-syntax

A class has a namespace implemented by a dictionary object. Class attribute references are translated to lookups in this dictionary, e.g., C.x is translated to C.__dict__["x"]

http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes

class Classy :
    CLASSIES = []

print '"CLASSIES" in globals()',"CLASSIES" in globals()
print '"CLASSIES" in Classy.__dict__ ==',"CLASSIES" in Classy.__dict__

结果

"CLASSIES" in globals() False
"CLASSIES" in Classy.__dict__ == True

德尔南,你怎么继续假装经典是全球性的??
在你和拿铁的辩论中我误解了什么吗?在

相关问题 更多 >

    热门问题