在内置变量之后命名实例变量是一种不好的做法吗

Is it a bad practice to name a instance variable after a built-in

以 python 内置变量命名的变量是一种不好的做法,因为它 ,并且可能会使读者感到困惑。

但是实例变量呢:

class MyClass:
    def __init__(self, type_):
        self.type = type_

有什么好的理由反对吗?

我会说没关系。

通过 Python 的标准库进行搜索,您可以看到很多地方的属性与内置函数的名称相同:

例如:

:~/cpython/Lib$ egrep -R "\.set[^a-zA-Z0-9_]" | wc -l
583
:~/cpython/Lib$ egrep -R "\.type[^a-zA-Z0-9_]" | wc -l
319

很确定有人会发现这个基于意见...

但是,这是我的:

不,这不是一个坏习惯。那些 class 属性只是 实例 __dict__ 区域中的字段(mgnmgnmnnn...很好,或者 __slots__),因此是实例绑定。您不能将 self.type 与内置的 type 混淆(self.type 始终需要使用 self. 访问),因此您隐含地限制了范围。 .. 有点()就像当你有 from os import path...

时一个名为 path 的变量发生的情况

如果你有:

from os import path
path="/home/borrajax/foo.txt"
path.join(path, ...)  # Eeeeeeermmm... I'm kind of screwed here?

但是,如果您这样做:

import os
path="/home/borrajax/foo.txt"
os.path.join(path, ...)

你很好,因为你的范围很明确。

我认为(也许有人不同意)的方式是classes/instances以类似的方式限制范围。当你看到self.type,你就知道它必须绑定到一个实例!!

但是,您有点……嗯……是的……如果您尝试覆盖 classes 的内置属性:

class A:
    def __init__(self):
        self.__dict__ = "foo"
        self.a = "hi"

if __name__ == "__main__":
    a = A()

会给你:

$ python ./stack_055_B.py
Traceback (most recent call last):
  File "./stack_055_B.py", line 7, in <module>
    a = A()
  File "./stack_055_B.py", line 3, in __init__
    self.__dict__ = "foo"
TypeError: __dict__ must be set to a dictionary, not a 'str'

some_object.type != type(some_object) 会令人困惑吗?是的,至少对我来说。所以你有很好的理由反对它:它可能会让读者感到困惑