有这个代码:
class Sample:
variable = 2
object1 = Sample()
object2 = Sample()
print object1.variable # 2
print object2.variable # 2
object1.variable = 1
print object1.variable # 1
print object2.variable # 2 <- why not 1 too?
Run Code Online (Sandbox Code Playgroud)
为什么object2.variable在赋值给类变量后也不是1?
直接在类定义下定义的字典和列表充当静态(例如,这个问题)
为什么其他变量如整数不会?
>>> class Foo():
bar=1
>>> a=Foo()
>>> b=Foo()
>>> a.bar=4
>>> b.bar
1
>>> class Foo():
bar={}
>>> a=Foo()
>>> b=Foo()
>>> a.bar[7]=8
>>> b.bar
{7: 8}
Run Code Online (Sandbox Code Playgroud) 有关于如何从静态方法访问静态变量(如大量的回答这一个,和那一个,而关于这个主题的伟大的信息在这里),但我在与其他方向的麻烦:如何使用静态方法初始化静态变量.例如:
import os, platform
class A(object):
@staticmethod
def getRoot():
return 'C:\\' if platform.system() == 'Windows' else '/'
pth = os.path.join(A.getRoot(), 'some', 'path')
Run Code Online (Sandbox Code Playgroud)
最后一行给出了一个例外:NameError: name 'A' is not defined.如果我使用@classmethod而不是,则会发生同样的错误@staticmethod.
是否可以从类变量访问静态方法?
Python为这样的实例支持@property装饰器:
class MyClass(object):
def __init__(self):
self._friend_stack = [1]
@property
def current_friend(self):
return self._friend_stack[0]
myobj = MyClass()
myobj.current_friend # 1
Run Code Online (Sandbox Code Playgroud)
是否有可能为类具有类似的东西,以便行为是这样的(例如,与setter和getter方法一起):
class MyClass(object):
_friend_stack = [1]
@property
def current_friend(cls):
return cls._friend_stack[0]
MyClass.current_friend # 1
Run Code Online (Sandbox Code Playgroud) 我一直在努力理解Python对类和实例变量的处理.特别是,我发现这个答案很有帮助.基本上它说如果你声明一个类变量,然后你做一个赋值[instance].property,你将完全分配一个不同的变量 - 一个与类变量不同的命名空间.
所以我考虑过 - 如果我希望我的类的每个实例都有一个默认值(比如零)的成员,我应该这样做:
class Foo:
num = 0
Run Code Online (Sandbox Code Playgroud)
或者像这样?
class Foo:
def __init__(self):
self.num = 0
Run Code Online (Sandbox Code Playgroud)
基于我之前读过的内容,我认为第二个例子是初始化'right'变量(实例而不是类变量).但是,我发现第一种方法也非常有效:
class Foo:
num = 0
bar = Foo()
bar.num += 1 # good, no error here, meaning that bar has an attribute 'num'
bar.num
>>> 1
Foo.num
>>> 0 # yet the class variable is not modified! so what 'num' did I add to just now?
Run Code Online (Sandbox Code Playgroud)
那么..为什么这个有效?我得不到什么?FWIW,我之前对OOP的理解来自C++,因此通过类比(或指向它发生故障)的解释可能是有用的.
好的,这次我会非常清楚.
class Yes:
def __init__(self):
self.a=1
def yes(self):
if self.a==1:
print "Yes"
else:
print "No, but yes"
class No(Yes):
def no(self):
if self.a==1:
print "No"
else:
print "Yes, but no"
self.a-=1 #Note this line
Run Code Online (Sandbox Code Playgroud)
现在,在运行时:
Yes().yes()
No().no()
Yes().yes()
No().no()
Run Code Online (Sandbox Code Playgroud)
我希望它打印出来:
Yes
No
No, but yes
Yes, but no
Run Code Online (Sandbox Code Playgroud)
它给了我:
Yes
No
Yes
No
Run Code Online (Sandbox Code Playgroud)
现在,我知道原因是因为我只改变了No类中Self.a的值(还记得那行吗?).我想知道是否还有在Yes类中更改它仍然在No类中(就好像我可以插入一些代替self.a- = 1的东西).
Python类属性和Java静态属性有什么区别?
例如,
在Python中
class Example:
attribute = 3
Run Code Online (Sandbox Code Playgroud)
在Java中
public class Example {
private static int attribute;
}
Run Code Online (Sandbox Code Playgroud)
在Python中,可以使用对实例的引用来访问静态属性吗?
如果我定义一个简单的类
class someClass():
var = 1
x = someClass()
someClass.var = 2
Run Code Online (Sandbox Code Playgroud)
这将使x.var等于 2。这是令人困惑的,因为通常类似于这样的东西:
a = 1
b = a
a = 2
Run Code Online (Sandbox Code Playgroud)
将保持 b 完好无损b==1。那么为什么这与类变量不同呢?区别在哪里?可以调用所有类变量可变吗?在某种程度上,类变量的工作更像是将列表分配给a=[1]并执行a[0]=2.
基本上问题是如何x.var访问 someClass.var 它必须是不同的,然后在 python 中将两个变量设置为相等时使用。怎么了?
我在 PyCharm 项目中有以下 Python 代码:
class Category:
text: str
a = Category()
a.text = 1.5454654 # where is the warning?
Run Code Online (Sandbox Code Playgroud)
当我尝试设置错误类型的属性时,编辑器应该显示警告。看看下面的设置:
我一直在阅读和使用Django一段时间.我仍然困惑的一件事是为什么我们在Django中创建的模型类由静态变量而不是成员变量组成.例如
class Album(models.Model):
artist = models.CharField(max_length=128, unique=True)
title = models.CharField(max_length=128, unique=True)
genre = models.CharField(max_length=128, unique=True)
def __unicode__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
我在这里阅读了这个解释python中静态变量和实例变量的页面但是我仍然对为什么Django希望模型中的字段变量是静态的而感到困惑?
python ×10
class ×4
static ×2
attributes ×1
django ×1
java ×1
object ×1
oop ×1
pycharm ×1
python-2.7 ×1
typechecking ×1
variables ×1