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

时间:2016-10-29 23:16:09

标签: python reserved-words built-in

拥有以python内置命名的变量是一种不好的做法,因为它prevents their proper usage,可能会让读者感到困惑。

但是实例变量怎么样:

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

对此有充分的理由吗?

3 个答案:

答案 0 :(得分:7)

我会说没关系。

通过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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

然而,这是我的:

不,这不是一个坏习惯。这些类属性只是实例__dict__区域中的字段(mgnmgnmnnn ... fine,或__slots__),因此是实例绑定的。您不能将self.type误认为内置typeself.type始终需要使用self.进行访问),因此您需要隐式限制范围......有一点(),就像path ... {/ p>时变量名为from os import 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, ...)

你完全没问题,因为你的范围很明确。

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

然而,你有点......呃......是的......如果你试图覆盖类的内置属性:

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'