未实例化的类属性

时间:2010-07-07 05:48:11

标签: python

您好我需要一个未实例化的类属性,我这样做:

>>> class X:
...     def __init__(self, y=None):
...             self.y = list()

这可以吗?如果不是,还有另一种方法吗?我无法在__init__中实例化此属性,因为我稍后会附加此属性。

4 个答案:

答案 0 :(得分:4)

在类级属性上定义y var。你需要将它初始化为某个东西,即使它是一个空列表(正如你之前所做的那样)。

>>> class X:
...     y = [] 
...     def __init__(self):
...         pass

根据您的评论进行更新:

你提到你在术语上混淆了(我假设在类和实例变量之间),所以如果你使用这个类会发生什么(并且可能不是你想要的)。

>>> class X:
...     y = [] # Class level attribute
...     def __init__(self):
...             pass
... 
>>> x = X()
>>> x.y.append(1)
>>> x.y
[1]
>>> x.y.append(2)
>>> z = X()
>>> z.y.append(3)
>>> z.y
[1, 2, 3]
>>> X.y.append(4)
>>> [1, 2, 3, 4]

请注意,当您向类添加变量时,它会在构造之间粘贴。在前面的代码中,我们将变量x和变量z实例化为X的实例。当我们添加到y实例中的z变量时,我们仍然追加到类变量y。请注意最后一行(X.y.append(4))我使用对类X的引用附加项目。

您可能想要的是基于原始帖子:

>>> class X:
...     def __init__(self, y=None):
...             self.y = y or list() # Instance level attribute.  Default to empty list if y is not passed in.
... 
>>> x = X()
>>> x.y.append(1)
>>> x.y
[1]
>>> z = X()
>>> z.y.append(2)
>>> z.y
[2]
>>> 
>>> s = X()
>>> s.y
[]
>>> t = X(y=[10])
>>> t.y
[10]

注意如何为每个实例创建一个新列表。当我们创建一个新实例z并尝试附加到y变量时,我们只获取附加的值,而不是将所有现有的添加内容保留在列表中。在最后一个实例化(t)示例中,构造函数在其构造中传递y参数,因此列表[10]y实例变量。

希望这会有所帮助。随意提出更多的不确定性作为评论。另外,我建议阅读Python类文档here

答案 1 :(得分:2)

如果您需要一个初始的空属性,稍后您将添加项目,只需执行此操作

class X(object):
    def __init__(self):
        self.y = []

这里有很多事情需要注意(与您的版本不同)

  • object
  • 派生班级
  • y = list()y = []相同,是首选。
  • 当您不使用时,无需使用默认参数y=None

答案 2 :(得分:2)

添加到其他语句: 有类变量和实例变量,它们是分开的,不能以相同的方式访问。 例如:

class foo:
    x=[]
    def __init__(self):
        self.y=[]

foo.x.append(20)
f = foo()
f.y.append(30)
print f.y
print foo.x
print f.x
print foo.y
#results-------------------------------
[30]
[20]
[20]
Traceback (most recent call last):
  File "C:\Users\adminuser\Desktop\temp.py", line 12, in <module>
    print foo.y
AttributeError: class foo has no attribute 'y'

答案 3 :(得分:0)

让我逐步解释Anurag Uniyal的答案

class X(object):
    def __init__(self, y=None):
        if y is None:
            # y wasn't specified, create an empty list
            self.y = []
        else:
            # y was specified, use it
            try:
                self.y = list(y) #create y's copy so that the original
                              # variable is safe
            except TypeError:
                # ooops, couldn't create a list. We might warn
                # the user or something. Oh, nevermind
                self.y = []