복붙노트

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

PYTHON

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

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

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

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

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

PHP에서는 변수를 키로 사용할 수 있지만 파이썬의 객체는 비서 적이기 때문에 점 표기법을 사용하면 내 의도가 아닌 내 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

최신 정보: 속성으로는이 객체의 변수 만 의미하고 메소드는 의미하지 않습니다.

해결법

  1. ==============================

    1.클래스가 있다고 가정합니다.

    클래스가 있다고 가정합니다.

    >>> 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']
    

    메서드를 필터링하려면 내장 된 호출 가능 함수를 검사로 사용할 수 있습니다.

    >>> [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__'])
    
  2. ==============================

    2.일반적으로 클래스에 __iter__ 메쏘드를 넣고 객체 속성을 반복하거나이 mixin 클래스를 클래스에 넣습니다.

    일반적으로 클래스에 __iter__ 메쏘드를 넣고 객체 속성을 반복하거나이 mixin 클래스를 클래스에 넣습니다.

    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'}
    
  3. ==============================

    3.파이썬의 객체는 __dict__이라는 dict에 함수 (함수 포함)를 저장합니다. 이 속성을 직접 액세스 할 수는 있지만 일반적으로 사용해서는 안됩니다. 리스트를 원한다면, dir (obj)를 호출 할 수도있다. dir (obj)는 모든 속성 이름을 가진 반복 가능한 값을 리턴한다. geter는 getattr에 전달할 수있다.

    파이썬의 객체는 __dict__이라는 dict에 함수 (함수 포함)를 저장합니다. 이 속성을 직접 액세스 할 수는 있지만 일반적으로 사용해서는 안됩니다. 리스트를 원한다면, dir (obj)를 호출 할 수도있다. dir (obj)는 모든 속성 이름을 가진 반복 가능한 값을 리턴한다. geter는 getattr에 전달할 수있다.

    그러나 변수의 이름을 가지고 무엇인가를해야하는 것은 대개 잘못된 설계입니다. 컬렉션에 보관하지 않으시겠습니까?

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

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

  4. ==============================

    4.

    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
    

    다음 iterable로 그냥 호출

    s=someclass()
    for k,v in s:
        print k,"=",v
    
  5. ==============================

    5.파이썬 3.6 용

    파이썬 3.6 용

    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
    
  6. ==============================

    6.파이썬 3.6 용

    파이썬 3.6 용

    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
    
  7. ==============================

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

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

    특히, 여러분의 예제에서 method1은 속성과 마찬가지로 훌륭합니다.

  8. from https://stackoverflow.com/questions/11637293/iterate-over-object-attributes-in-python by cc-by-sa and MIT license