代码之家  ›  专栏  ›  技术社区  ›  Chris Bunch

如何在Python中获取实例变量?

  •  97
  • Chris Bunch  · 技术社区  · 16 年前

    class hi:
      def __init__(self):
        self.ii = "foo"
        self.kk = "bar"
    

    我有没有办法做到这一点:

    >>> mystery_method(hi)
    ["ii", "kk"]
    

    8 回复  |  直到 7 年前
        1
  •  166
  •   cnu    16 年前

    每个物体都有一个 __dict__ 包含所有变量及其值的变量。

    试试这个

    >>> hi_obj = hi()
    >>> hi_obj.__dict__.keys()
    
        2
  •  117
  •   user136623 Jeremy Cantrell    13 年前

    class Foo(object):
        def __init__(self):
            self.a = 1
            self.b = 2
    
    vars(Foo()) #==> {'a': 1, 'b': 2}
    vars(Foo()).keys() #==> ['a', 'b']
    
        3
  •  19
  •   Thomas Wouters    16 年前

    通常情况下,您无法仅获得一个类的实例属性,至少在不实例化该类的情况下是如此。但是,您可以在给定实例的情况下获取实例属性,也可以在给定类的情况下获取类属性。请参阅“检查”模块。您无法获得实例属性的列表,因为实例实际上可以将任何内容作为属性,并且--在您的示例中--创建它们的正常方法是只在_uinit__;方法中分配给它们。

    例外情况是,如果您的类使用slot,它是该类允许实例拥有的属性的固定列表。插槽在中进行了解释 http://www.python.org/2.2.3/descrintro.html ,但插槽存在各种陷阱;它们会影响内存布局,因此多重继承可能会有问题,一般来说,继承也必须考虑插槽。

        4
  •  14
  •   dmark    14 年前

    class foo:
      a = 'foo'
      b = 'bar'
    

    def printVars(object):
        for i in [v for v in dir(object) if not callable(getattr(object,v))]:
            print '\n%s:' % i
            exec('print object.%s\n\n') % i
    
        5
  •  13
  •   daniel    16 年前

    您还可以测试对象是否具有以下特定变量:

    >>> hi_obj = hi()
    >>> hasattr(hi_obj, "some attribute")
    
        6
  •  6
  •   S.Lott    16 年前

    您的示例显示的是“实例变量”,而不是真正的类变量。

    hi_obj.__class__.__dict__.items() 对于类变量,以及其他类成员,如成员函数和包含模块。

    class Hi( object ):
        class_var = ( 23, 'skidoo' ) # class variable
        def __init__( self ):
            self.ii = "foo" # instance variable
            self.jj = "bar"
    

    类变量由类的所有实例共享。

        7
  •  6
  •   martin clayton egrunin    14 年前

    >>> print vars.__doc__
    vars([object]) -> dictionary
    
    Without arguments, equivalent to locals().
    With an argument, equivalent to object.__dict__.
    

    换言之,它本质上只是包装__

        8
  •  5
  •   tim.tadh    16 年前

    虽然不能直接回答OP问题,但有一种非常好的方法可以找出函数中作用域中的变量。请看下面的代码:

    >>> def f(x, y):
        z = x**2 + y**2
        sqrt_z = z**.5
        return sqrt_z
    
    >>> f.func_code.co_varnames
    ('x', 'y', 'z', 'sqrt_z')
    >>> 
    

    def exec_command(self, cmd, msg, sig):
    
        def message(msg):
            a = self.link.process(self.link.recieved_message(msg))
            self.exec_command(*a)
    
        def error(msg):
            self.printer.printInfo(msg)
    
        def set_usrlist(msg):
            self.client.connected_users = msg
    
        def chatmessage(msg):
            self.printer.printInfo(msg)
    
        if not locals().has_key(cmd): return
        cmd = locals()[cmd]
    
        try:
            if 'sig' in cmd.func_code.co_varnames and \
                           'msg' in cmd.func_code.co_varnames: 
                cmd(msg, sig)
            elif 'msg' in cmd.func_code.co_varnames: 
                cmd(msg)
            else:
                cmd()
        except Exception, e:
            print '\n-----------ERROR-----------'
            print 'error: ', e
            print 'Error proccessing: ', cmd.__name__
            print 'Message: ', msg
            print 'Sig: ', sig
            print '-----------ERROR-----------\n'
    
        9
  •  2
  •   adiga    5 年前

    基于dmark的答案,可以得到以下内容,如果你想获得sprintf的等价物,这很有用,希望能帮助到某人。。。

    def sprint(object):
        result = ''
        for i in [v for v in dir(object) if not callable(getattr(object, v)) and v[0] != '_']:
            result += '\n%s:' % i + str(getattr(object, i, ''))
        return result
    
        10
  •  1
  •   hi2meuk    5 年前

    有时,您希望根据公共/私有变量筛选列表。例如。

    def pub_vars(self):
        """Gives the variable names of our instance we want to expose
        """
        return [k for k in vars(self) if not k.startswith('_')]
    
        11
  •  0
  •   Eric Silveira    4 年前

    你首先需要, 下一个 检查字节码中的函数 复制字节码 使用 __code__.co_varnames . 这很棘手 有些类使用构造函数创建方法,如 types 单元 . 我将在上为它提供代码 GitHub