파이썬에서 객체 속성 반복하기

여러 속성과 메서드가 있는 파이썬 객체가 있습니다. 객체 속성을 반복하고 싶습니다.

class my_python_obj(object):
    attr1='a'
    attr2='b'
    attr3='c'

    def method1(self, etc, etc):
        #Statements

모든 객체 속성과 현재 값을 포함하는 사전을 생성하고 싶지만 동적인 방식으로 하고 싶습니다(나중에 다른 속성을 추가할 때 함수를 업데이트하는 것을 기억할 필요가 없도록).

PHP에서는 변수를 키로 사용할 수 있지만 파이썬의 객체는 스크립트가 불가능하며 점 표기법을 사용하면 내 변수의 이름으로 새 속성이 생성되는데 이는 내 의도가 아닙니다.

더 명확하게 설명하기 위해서입니다:

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

업데이트: 속성이란 메서드가 아닌 이 객체의 변수만을 의미합니다.

질문에 대한 의견 (2)
해결책

다음과 같은 클래스가 있다고 가정합니다.

>>> class Cls(object):
...     foo = 1
...     bar = 'hello'
...     def func(self):
...         return 'call me'
...
>>> obj = Cls()

객체에서 dir을 호출하면 파이썬 특수 어트리뷰트를 포함한 해당 객체의 모든 어트리뷰트를 돌려받을 수 있습니다. 메서드와 같은 일부 객체 속성은 호출 가능하지만.

>>> 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__'])
해설 (14)
    • 및 반복할 수 있는 방법을 일반적으로 "iter" put a 클래스 속성 또는 이거 믹스인 클래스용 객체에는 클래스에.
class IterMixin(object):
    def __iter__(self):
        for attr, value in self.__dict__.iteritems():
            yield attr, value

클래스에:

>>> class YourClass(IterMixin): pass
...
>>> yc = YourClass()
>>> yc.one = range(15)
>>> yc.two = 'test'
>>> dict(yc)
{'one': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 'two': 'test'}
해설 (2)

파이썬의 객체는 (함수를 포함한) 어트리뷰트를 __dict__라는 딕셔너리에 저장합니다. 이를 사용해 어트리뷰트에 직접 액세스할 수 있지만 일반적으로는 사용하지 않아야 합니다. 목록만 필요한 경우 모든 어트리뷰트 이름이 포함된 이터러블을 반환하는 dir(obj)을 호출하여 getattr에 전달할 수도 있습니다.

그러나 변수 이름으로 무언가를 해야 하는 것은 일반적으로 나쁜 설계입니다. 컬렉션에 보관하지 않는 이유는 무엇일까요?

class Foo(object):
    def __init__(self, **values):
        self.special_values = values

그런 다음 for key in obj.special_values:를 사용하여 키를 반복할 수 있습니다.

해설 (2)

이미 언급한 바와 같이 일부 답변 / 설명, 파이썬 객체에는 사전을 저장할 이미 그들의 속성 (메서드을 aren& # 39, t 포함). 그러나 이 같은 '를 사용하는 것이 더 나은 방법으로 https://learning. dict', '은' (출력물에는 표시되어도 마찬가지다). 참고로 이 사전은 거역한다면 속성을 수정하십시오 인스턴스에 대한 수정! 하지만 수 있는 방법을 사용하면 유용할 수 있습니다 또한, 이 사전은 않도록 주의해야 합니다. # 39 의 here& 빠른 예:

"'파이썬 class A (): 데프 init (자체 x, y, z = = 3 = 2, 5): 셀프리스 = x self._y = y self.z = z

데프 f (self): 패스

a = A () 보기인쇄 (var (a))

# 39, & # 39, {x&. # 39, & # 39 3 _y&;;: # 39, & # 39 z& 2;;: 5}

모든 속성은 'a' 없고 방법!

참고 어떻게 항상 최신품이다 사전

아리스 = 10 보기인쇄 (var (a))

# 39, & # 39, {x&. 10: # 39, & # 39 _y&;; # 39, & # 39 z& 2;;: 5}

수정되므로 인스턴스 속성을 사전 수정

var (a) [&quot _y";] = 20 보기인쇄 (var (a))

# 39, & # 39, {x&. 10: # 39, & # 39 _y&;; # 39, & # 39 z& 20;;: 5}

"'

'사용하여 디렉터리 (a)' 는 바로 이 문제에 대한 좋지 않은 경우, 외곽진입 홀수입니다. # 39 의 it& 반복할 경우 필요한 모든 속성 및 메서드 정말 좋은 클래스 (init 'like' 특별한 방법 등). 그러나 이 doesn& # 39, t 것으로 그리웠댔지, 심지어 수락됨 오토메이티드 댁이라면 우리 섹스한거요 잘못 적용해 지루려면 그냥 속성 및 메서드 및 남겨두십시오 시도하시려면 필터링부터 일부 브리틀 위에 정의된 클래스 'A' 이 실패할 경우 확인할 수 있습니다.

(사용 'dict' 적이 몇 있지만, 이 모든 질문에 대한 불필요한 메서드을 정의하십시오 사용하지 않고 직접. 전용 [셀명] 제안됩니다 사용할 수 있는 '은').

[셀명]: https://stackoverflow.com/questions/11637293/iterate-over-object-attributes-in-python # comment93597568_11637457)

해설 (0)
class someclass:
        x=1
        y=2
        z=3
        def __init__(self):
           self.current_idx = 0
           self.items = ["x","y","z"]
        def next(self):
            if self.current_idx < len(self.items):
                self.current_idx += 1
                k = self.items[self.current_idx-1]
                return (k,getattr(self,k))
            else:
                raise StopIteration
        def __iter__(self):
           return self

그럼 그냥 이트레이블 표시됨과 부르네요

s=someclass()
for k,v in s:
    print k,"=",v
해설 (1)

이에 대한 정답은 하지 말아야 한다는 것입니다. 이러한 유형의 작업을 원한다면 딕셔너리를 사용하거나 일부 컨테이너에 속성을 명시적으로 추가해야 합니다. 데코레이터에 대해 배우면 이를 자동화할 수 있습니다.

특히 예제의 방법1은 좋은 어트리뷰트입니다.

해설 (4)

파이썬 3.6tb 대한

class SomeClass:

    def attr_list(self, should_print=False):

        items = self.__dict__.items()
        if should_print:
            [print(f"attribute: {k}    value: {v}") for k, v in items]

        return items
해설 (1)

파이썬 3.6tb 대한

class SomeClass:

    def attr_list1(self, should_print=False):

        for k in self.__dict__.keys():
            v = self.__dict__.__getitem__(k)
            if should_print:
                print(f"attr: {k}    value: {v}")

    def attr_list(self, should_print=False):

        b = [(k, v) for k, v in self.__dict__.items()]
        if should_print:
            [print(f"attr: {a[0]}    value: {a[1]}") for a in b]
        return b
해설 (3)