在内置变量之后命名实例变量是一种不好的做法吗
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)
会令人困惑吗?是的,至少对我来说。所以你有很好的理由反对它:它可能会让读者感到困惑。
以 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)
会令人困惑吗?是的,至少对我来说。所以你有很好的理由反对它:它可能会让读者感到困惑。