遍历python中的对象属性

我有一个带有几个属性和方法的python对象。我想遍历对象属性。


class my_python_obj(object):

    attr1='a'

    attr2='b'

    attr3='c'


    def method1(self, etc, etc):

        #Statements

我想生成一个包含所有对象属性及其当前值的字典,但是我想以一种动态的方式进行操作(因此,如果以后添加另一个属性,我也不必记住要更新我的函数)。


在php中,变量可以用作键,但是python中的对象不可更改,如果我为此使用点符号,则会创建一个新属性,其名称为var,这不是我的意图。


为了使事情更清楚:


def to_dict(self):

    '''this is what I already have'''

    d={}

    d["attr1"]= self.attr1

    d["attr2"]= self.attr2

    d["attr3"]= self.attr3

    return d

·


def to_dict(self):

    '''this is what I want to do'''

    d={}

    for v in my_python_obj.attributes:

        d[v] = self.v

    return d

更新:对于属性,我的意思是仅此对象的变量,而不是方法。


噜噜哒
浏览 3258回答 3
3回答

慕容森

假设您有一个诸如>>> class Cls(object):...     foo = 1...     bar = 'hello'...     def func(self):...         return 'call me'...>>> obj = Cls()调用dir该对象会返回该对象的所有属性,包括python特殊属性。尽管某些对象属性是可调用的,例如方法。>>> dir(obj)['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo', 'func']您始终可以使用列表理解来过滤掉特殊方法。>>> [a for a in dir(obj) if not a.startswith('__')]['bar', 'foo', 'func']或者您更喜欢地图/过滤器。>>> filter(lambda a: not a.startswith('__'), dir(obj))['bar', 'foo', 'func']如果要过滤掉这些方法,则可以使用内置函数callable作为检查。>>> [a for a in dir(obj) if not a.startswith('__') and not callable(getattr(obj,a))]['bar', 'foo']您还可以检查您的班级与其父班级之间的区别。>>> set(dir(Cls)) - set(dir(object))set(['__module__', 'bar', 'func', '__dict__', 'foo', '__weakref__'])

阿晨1998

python中的对象将其属性(包括函数)存储在称为的字典中__dict__。您可以(但通常不应该)使用它直接访问属性。如果您只想要一个列表,也可以调用dir(obj),它返回带有所有属性名称的Iterable,然后可以将其传递给getattr。但是,需要对变量名称做任何事情通常都是不好的设计。为什么不将它们保存在集合中?class Foo(object):    def __init__(self, **values):        self.special_values = values然后,您可以使用 for key in obj.special_values:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python