相关疑难解决方法(0)

同一类的两个实例的Class属性

有这个代码:

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?

python

6
推荐指数
1
解决办法
1218
查看次数

为什么有些类变量看起来像静态,而有些则不然?

直接在类定义下定义的字典和列表充当静态(例如,这个问题)
为什么其他变量如整数不会?

>>> 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)

python

6
推荐指数
2
解决办法
205
查看次数

从静态变量访问静态方法

有关于如何从静态方法访问静态变量(如大量的回答这一个,和那一个,而关于这个主题的伟大的信息在这里),但我在与其他方向的麻烦:如何使用静态方法初始化静态变量.例如:

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 static python-2.7

6
推荐指数
1
解决办法
875
查看次数

Python中的每类@property装饰器

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

6
推荐指数
1
解决办法
1124
查看次数

复合赋值给Python类和实例变量

我一直在努力理解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++,因此通过类比(或指向它发生故障)的解释可能是有用的.

python class

5
推荐指数
1
解决办法
5942
查看次数

Python改变类变量

好的,这次我会非常清楚.

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 variables class

5
推荐指数
1
解决办法
3万
查看次数

静态属性(Python与Java)

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中,可以使用对实例的引用来访问静态属性吗?

python java attributes class

5
推荐指数
1
解决办法
492
查看次数

类变量是可变的吗?

如果我定义一个简单的类

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 中将两个变量设置为相等时使用。怎么了?

python oop static class object

5
推荐指数
1
解决办法
1683
查看次数

PyCharm 中的类型检查类静态变量

我在 PyCharm 项目中有以下 Python 代码:

class Category:
    text: str

a = Category()
a.text = 1.5454654  # where is the warning?
Run Code Online (Sandbox Code Playgroud)

当我尝试设置错误类型的属性时,编辑器应该显示警告。看看下面的设置:

PyCharm 设置配置的屏幕截图

python static-variables typechecking pycharm python-typing

5
推荐指数
1
解决办法
3058
查看次数

Django - 为什么在Model Classes Static中声明变量

我一直在阅读和使用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 django

4
推荐指数
1
解决办法
1442
查看次数