是做什么的区别
class a:
def __init__(self):
self.val=1
干什么
class a:
val=1
def __init__(self):
pass
是做什么的区别
class a:
def __init__(self):
self.val=1
干什么
class a:
val=1
def __init__(self):
pass
class a:
def __init__(self):
self.val=1
这将创建一个类(在的Py2,一个眉头,传统的,旧式的, 不这样做,类;在PY 3,讨厌的老传统班终于消失所以这将是一个类中的一个,只有一种- ! -所述**好*样,这需要class a(object):
在的Py2),使得每个实例开始与它自己的参考整数对象1
。
class a:
val=1
def __init__(self):
pass
这创造了一个类(同种),其本身具有到整数对象的引用1
(它的实例,没有每个实例参考开始时)。
对于像immutables int
值,很难看到有实际贡献。 例如,在这两种情况下,如果以后做self.val = 2
上的一个实例a
,这将使实例引用(现有的答案是这方面的严重错误)。
这种区别是可变对象很重要,因为他们有突变基因的方法,所以这是非常重要的知道,如果某个列表是每个实例是唯一的或所有实例中共享。 但是,对于不可改变的对象,因为你永远无法改变的对象本身,而只能分配(例如到self.val
,这总会让每个实例引用),这是相当小的。
只是对于immutables唯一的区别:如果以后分配a.val = 3
,在第一种情况下,这将影响到什么视为self.val
每个实例(除了有自己的实例self.val
分配 ,或相当于动作); 在第二种情况下,也不会影响什么被视为self.val
任何情况下(除了用于您已经执行情况del self.val
或等效的动作)。
其他人则解释了技术差异。 我会尽力解释为什么你可能需要使用类变量。
如果你只实例化类一次,然后类变量有效的实例变量。 但是,如果你正在做许多拷贝,或者想分享几个实例间的状态,那么类变量是非常方便的。 例如:
class Foo(object):
def __init__(self):
self.bar = expensivefunction()
myobjs = [Foo() for _ in range(1000000)]
会造成expensivefunction()被调用一百万次。 如果它要每次都返回相同的值,比如从数据库中获取的配置参数,那么你应该考虑将其移动到类定义,以便它只是调用一次,然后在所有实例共享。
memoizing结果时,我也用类变量很多。 例:
class Foo(object):
bazcache = {}
@classmethod
def baz(cls, key):
try:
result = cls.bazcache[key]
except KeyError:
result = expensivefunction(key)
cls.bazcache[key] = result
return result
在这种情况下,巴兹是一个类的方法; 其结果不依赖于任何实例变量。 这意味着我们可以保持类变量的结果高速缓存的一个副本,从而使1)你不相同的结果多次存储,以及2)每个实例都可以从其他情况下被缓存的结果中受益。
为了说明,假设你有一个亿的情况下,在谷歌搜索结果中的每个操作。 你可能更喜欢所有这些对象共享这些结果,而不是有每一个执行搜索并等待答案。
所以我想用伦纳特这里不同意。 类变量在某些情况下是非常方便的。 当他们对工作的工具,不要犹豫,使用它们。
正如其他人所提到的,在一种情况下它是在对实例的其他属性类的属性。 请问这件事情? 是的,在一种情况下它。 正如亚历克斯说,如果该值是可变的。 最好的解释是代码,所以我会添加一些代码来显示它(这是所有这个答案呢,真的):
第一类定义两个实例属性。
>>> class A(object):
... def __init__(self):
... self.number = 45
... self.letters = ['a', 'b', 'c']
...
再一类定义两个类的属性。
>>> class B(object):
... number = 45
... letters = ['a', 'b', 'c']
...
现在我们使用它们:
>>> a1 = A()
>>> a2 = A()
>>> a2.number = 15
>>> a2.letters.append('z')
一切都很好:
>>> a1.number
45
>>> a1.letters
['a', 'b', 'c']
现在使用class属性变化:
>>> b1 = B()
>>> b2 = B()
>>> b2.number = 15
>>> b2.letters.append('z')
和所有的...嗯...
>>> b1.number
45
>>> b1.letters
['a', 'b', 'c', 'z']
是啊,请注意,当你改变,可变类属性它改变了所有的班级。 这通常不是你想要的。
如果您使用的是ZODB,你用了很多类的属性,因为它是升级现有的对象具有新的属性,或添加上没有得到坚持一个一流水平的信息的一种方便的方法。 否则,你几乎可以忽略它们。