Python 和类属性声明

标签 python class attributes pep8

<分区>

有人告诉我在类范围内声明动态属性不是“Python 方式”,但我不明白为什么。 有人可以向我解释一下,或者向我指出一些文档来说明为什么这是一件坏事吗?老实说,我认为这是一个很好的做法,如果有的话,可以 self 记录代码。

示例:

class ClassA(object):
    user_data = {}

    def set_user(self):
        self.user_data['username'] = 'fred'

我能看到不使用它的唯一原因是属性是静态的(因此可能会产生误导)。

最佳答案

在评论中,您说,“嗯,每个实例都有不同的可变用户数据。”不,不会。 ClassA 的每个实例都将共享相同的 user_data 字典:

>>> class ClassA(object):
...     user_data = {}
...     def set_user(self, name):
...         self.user_data['name'] = name
...
>>> a1 = ClassA()
>>> a1.set_user('fred')
>>> a1.user_data
{'name': 'fred'}
>>>
>>> a2 = ClassA()
>>> a2.user_data
{'name': 'fred'}
>>> a2.set_user('barney')
>>> a2.user_data
{'name': 'barney'}
>>>
>>> a1.user_data
{'name': 'barney'}
>>>
>>> a1.user_data is a2.user_data
True

这与是否是 Pythonic 无关。只需编写按您希望的方式运行的代码即可。

关于Python 和类属性声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14815523/

相关文章:

python - 对连续的非连续切片进行 Numpy 缩减

python - OpenCV 3 与 Python 3 on Windows 独立高清

python : How to avoid numpy RuntimeWarning in function definition?

C++: 不匹配调用 '(concat) (std::string&)'

attributes - 如何在 jaxb 编码期间跳过空字段

ruby-on-rails - rails ,设计 : unknown attribute 'password' for User

python - 使用 ctrl-c 和 ctrl-v 复制并粘贴到 wxPython 中的 wx.Grid

c++ - C2653 : 'GUI' : is not a class or namespace

c# - 我如何记录一个 c# dll

c# 在自定义属性中执行代码