📅  最后修改于: 2023-12-03 14:48:16.679000             🧑  作者: Mango
在Python中,vars()
是一个内置函数,可以返回对象的属性列表。但是在某些情况下,我们并不希望返回下划线开头的属性,因为它们通常是被视作私有的。
Python中使用单下划线 _
来表示私有属性或方法,即这些属性或方法只能在类内部或子类中使用,而不应该被外部直接访问。因此,在默认模式下,vars()
会过滤掉下划线开头的属性。
但是在一些特殊的情况下,我们希望返回所有的属性,包括下划线开头的。那么这时候我们需要用到 vars 忽略模式。
通过将对象的类属性 __dict__
替换为一个更灵活的实现,可以控制 vars()
的行为。其中有一个实现名称为 vars
的魔法方法,可以覆盖内置的 vars()
函数,使其返回一些不在 __dict__
中的属性。
那么我们可以通过定义类属性 __vars_ignore__
来指定下划线开头的属性是否需要被过滤。具体实现方法如下:
class Foo:
def __init__(self, name):
self.__name = name
def __vars_ignore__(self):
return False
foo = Foo('bar')
print(vars(foo)) # {'_Foo__name': 'bar', '__module__': '__main__', '__init__': <function Foo.__init__ at 0x7f3ee0b9ac10>, '__vars_ignore__': <function Foo.__vars_ignore__ at 0x7f3ee0b9ac80>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>}
通过定义 __vars_ignore__
方法并返回 False
,我们可以使得 vars()
返回下划线开头的属性。
虽然 vars
忽略模式下划线可以解决一些特殊的问题,但并不推荐大规模使用。除非对 Python 内部有深入的了解,否则可能会引起一些预料之外的问题。
同时,下划线开头的属性通常是被视作私有的。在遵循对象的封装属性之下,我们应该尽可能通过类的属性和方法进行访问和操作。