📜  vars 忽略模式下划线 (1)

📅  最后修改于: 2023-12-03 14:48:16.679000             🧑  作者: Mango

vars 忽略模式下划线

介绍

在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 内部有深入的了解,否则可能会引起一些预料之外的问题。

同时,下划线开头的属性通常是被视作私有的。在遵循对象的封装属性之下,我们应该尽可能通过类的属性和方法进行访问和操作。