拥有以python内置命名的变量是一种不好的做法,因为它prevents their proper usage,可能会让读者感到困惑。
但是实例变量怎么样:
class MyClass:
def __init__(self, type_):
self.type = type_
对此有充分的理由吗?
答案 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
误认为内置type
(self.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'