[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.클래스가 있다고 가정합니다.
클래스가 있다고 가정합니다.
>>> 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.일반적으로 클래스에 __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.파이썬의 객체는 __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.
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.파이썬 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.파이썬 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.이에 대한 정답은하지 말아야한다는 것입니다. 이 유형의 것을 원한다면 dict를 사용하거나 명시 적으로 속성을 일부 컨테이너에 추가해야합니다. 데코레이터에 대해 배우면 자동화 할 수 있습니다.
이에 대한 정답은하지 말아야한다는 것입니다. 이 유형의 것을 원한다면 dict를 사용하거나 명시 적으로 속성을 일부 컨테이너에 추가해야합니다. 데코레이터에 대해 배우면 자동화 할 수 있습니다.
특히, 여러분의 예제에서 method1은 속성과 마찬가지로 훌륭합니다.
from https://stackoverflow.com/questions/11637293/iterate-over-object-attributes-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] matplotlib에 두 번째 x 축을 추가하는 방법 (0) | 2018.10.06 |
---|---|
[PYTHON] 파이썬에서 파일로부터 문자 읽기 (0) | 2018.10.06 |
[PYTHON] 파이썬 소켓은 많은 양의 데이터를받습니다. (0) | 2018.10.06 |
[PYTHON] dict의 키와 값을`unicode`에서`str`으로 변환하는 가장 빠른 방법은 무엇입니까? (0) | 2018.10.06 |
[PYTHON] 이 OpenCV Python 인터페이스들 사이에 다른 점은 무엇입니까? (0) | 2018.10.06 |