2010-07-07 214 views
1

你好,我需要一个非实例类属性,我这样做:未初始化类属性

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

这是好吗?如果不是,是否有另一种方法。我不能在__init__中实例化这个属性,因为我会在后面追加这个属性。

+1

什么叫“未初始化类属性”是什么意思?你已经实例化了一个列表 – 2010-07-07 05:49:50

+1

*我不能在'__init__' *中实例化这个属性,但这就是你正在做的....我不明白你的问题。 – 2010-07-07 05:49:55

+0

这是实例化它的正确方法吗? – user225312 2010-07-07 05:52:40

回答

4

定义的类级属性y变种。你需要将它初始化为某种东西,即使它是一个空的列表(就像你之前做的那样)。

>>> 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的实例进行了实例化。虽然我们在z实例中添加了y变量,但我们仍附加到类变量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

+0

我的做法有什么问题? :) – user225312 2010-07-07 06:10:00

+0

你说“class属性”,所以这就是我所做的。如果你想坚持原来的基于实例的方式,我会将代码改为'self.y = y或者list()',如果这样的话,如果有人通过了'y',那么它会被使用,否则你会创建一个空的清单。 – sdolan 2010-07-07 06:19:57

+0

感谢和抱歉搞乱术语。 – user225312 2010-07-07 06:22:03

2

如果你需要一个初始为空的属性,以稍后您将添加项目,只是这样做

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

几件事情,这里要注意(从您的版本差异)

  • 派生从类object
  • y = list()y = []相同并且是优选的。
  • 不需要有默认参数y=None的,当你不使用它
+0

但没有明确指定:'def __init __(self,y)'使它更好? – user225312 2010-07-07 06:10:32

+0

@PulpFiction:否。除非构造函数实际使用参数,否则参数不应该在那里。 – 2010-07-07 06:34:57

+0

@David:那么使用y = None是不好的做法? – user225312 2010-07-07 06:43:28

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' 
+0

那么'x = []' - 类变量是什么?对不起,但试图了解这里的术语。 – user225312 2010-07-07 06:25:12

+0

@PulpFiction:是的,x是一个类属性,并在该类的所有实例之间共享。您也可以在不创建实例的情况下访问它。 y是对象属性,并为每个类的实例创建一个新对象。 – 2010-07-07 06:39:24

0

让我的程度阿努拉格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 = []