【问题标题】:How to view the instance variables of a class如何查看类的实例变量
【发布时间】:2014-01-26 20:18:18
【问题描述】:

我的 init 函数中有一个默认设置列表。这些默认值都是实例变量。例如,

self.set_acqmode = 1
self.set_readmode = 4
self.set_triggermode = 0

我在这个类中有一个函数,我想通过只传入一个名称和一个值作为参数来更改这些默认设置。例如,

def change_setting(self, setting, *arg):

什么是访问和更改正确实例变量的 Pythonic 方式。我曾尝试同时使用 vars() 和 dict 来查看这些变量,但前者只显示了类函数,而后者需要引用类的实例(尚不存在,因为这是在课堂上)。

(如果有更好的方法可以在不搜索变量的情况下执行此操作,我仍然想知道如何查看它们,只是出于兴趣。)

【问题讨论】:

  • 回答我自己问题的第二部分。我通过阅读答案发现我可以使用 self 作为对象引用。所以 self.__dict__ 显示了所有的实例变量。

标签: python class variables instance


【解决方案1】:

使用setattr:

def change_setting(self, setting, *arg):
    setattr(self, setting, arg)

【讨论】:

    【解决方案2】:

    你当然可以使用__dict__:

    >>> class Test(object):
        def __init__(self):
            self.x = 1
        def set(self, attr, val):
            self.__dict__[attr] = val
    
    >>> a = Test()
    >>> a.set('x', 2)
    >>> a.x
    2
    

    【讨论】:

      【解决方案3】:

      您可以在类名上使用__dict__,而无需实例化该类的对象。例如:

      print myClass.__dict__.keys()
      

      ::edit:: 当然,如果你编程比较严谨,可以考虑使用__slots__,这样你就可以自己预定义类的所有实例变量了。

      【讨论】:

        【解决方案4】:

        setattr 可以。但是你不得不问,如果你在重写 setattr 时遇到了所有这些麻烦,你这样做是否正确?

        如果您只想拥有一些任意键和值 - 好吧,那是一本字典,您应该这样使用它。如果您需要自定义行为,请覆盖 __getitem__/__setitem__。

        如果你真的需要属性,那么没有理由不使用父函数

        myobj.set_triggermode = value
        

        而不是过于复杂

        myobj.change_setting('triggermode', value)
        

        所以你应该这样做。即使您出于某种原因想要这样做 - 使用 kwargs 而不是 args,可能更接近您想要的。

        【讨论】:

        • 我确实想过为每个设置做一个父函数,但是有很多设置。这样我就可以只有一个函数,它可以根据需要更改变量。其中一些设置不会经常更改,但如果需要,我仍然需要有一种更改方式。一个完整的功能需要很长时间。
        • 不...您不需要函数。如果一个对象有一个属性x,那么你可以通过obj.x = value来改变它。你不必编写getter/setter,属性在python中总是公开的。
        • 你完全正确。有我在想事情......再次。您的解决方案很简单。虽然我确实学到了更多
        猜你喜欢
        • 2012-10-06
        • 2011-03-26
        • 2010-10-28
        • 2012-08-15
        • 2023-02-05
        • 2014-09-21
        • 2017-06-22
        • 1970-01-01
        • 2013-03-24
        相关资源
        最近更新 更多