Pablo Mescher
그는 물었다 8년 전
135

개체 속성에 반복할 파이썬

I have a 파이썬 객체에는 여러 개의 속성 및 메서드. 난 로렌아줌마가 반복할 객체에는 속성.

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

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

내가 원하는 것 모두를 포함하는 속성 및 해당 객체를 생성할 수 있지만, 현재 사전 값뿐 I want to do it 동적 길 (그래서 나중에 내가 다른 추가 속성용 don& # 39, 내가 아니라 내 함수은 업데이트하십시오 수 없다).

그러나 파이썬, php 로 사용될 수 있는 com/go/4e6b330a_kr 키를 사용하여 만든 점 표기법 엔드입니다 이은수스크리프터블 의 객체에는 있다 그리고 만약 내가 내 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
& # 183.

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

업데이트: 내 말은 이 객체의 특성과 com/go/4e6b330a_kr 아닌 유일한 방법입니다.

Hank Gay
그는 8년 전 댓글을 달았습니다
0

특히, https://stackoverflow.com/a/1251789/4203 는 @sean 갈 길. # 39; d 옵션을 사용하면 you& 통과시킬 것이라고 필터링합니다 '조건자' 인수를 호출 (바인딩될?) 함수 (없애는 얻을 수 있는 방법 중).

답변 8 개

You have a 클래스 등 가정)

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

원할 경우 또는 map / 필터링합니다.

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

Meitham
Julian
그는 8년 전 댓글을 달았습니다
1

39 이것은 안 좋은 생각, 내가 wouldn& 제안하세요 신앙이니라 you& # 39, re) 로 하고, 심지어 정보기술 (it), t, 적어도 제공하십시오 단서 조항.

Pablo Mescher
그는 8년 전 댓글을 달았습니다
0

이 간단한 것 같다. 문드러지는게 함께 경고? 잘못될 일이 있을까요?

Pablo Mescher
그는 8년 전 댓글을 달았습니다
0

디렉터 () 는 나열할 수 있습니다. 나만 나열할 com/go/4e6b330a_kr

Meitham
그는 8년 전 댓글을 달았습니다
0

메서드 호출 할 수 있도록 하고 있지만, 역시 객체에는 @pablo they& # 39, 모든 호출 객체에는 제외할지. 내아기마저도 업데이트하십시오 예.

Julian
그는 8년 전 댓글을 달았습니다
2

잘못된 # 39 의 @meitham @Pablo What& 주로 shouldn& # 39, 이렇게 해야 하는 것이 아니다. 포함), re 관심이 있는 속성을 you& 아닌 단독 # 39 합니다. # 39 로 볼 수 있는데, 이미 you& you& # 39, re 등 방법, 그리고 어떠한 시도도 잘못된 것 때문에 순결한 제외하려면 they& # 39, re like '' 또는 'nasty mediaagent 셨으며 호출 티페스트메서트리프'. 어떻게 됩니까, 특성 추가 호출됨 &quot _foo&quot. 그 결과, 일부 저장하는 중간 또는 내부 데이터 구조를? 그냥 소득 클래스 a '를 어떻게 됩니까, 이제' 라고 이름, 특성 추가 갑자기 it gets 포함되어 있습니다.

Meitham
그는 8년 전 댓글을 달았습니다
3

위 코드를 @julian 모두 '와' 이름 '같도다라고 그들은 이제 탄력을 받게 됐다' _foo 객체의 속성을. # 39 don& 경우 목록에서 제외할 수 있습니다, 번역 조건을 포함하지 않는다. 위의 코드는 파이썬 관용구 및 유명 길을 린트로스펙팅 파이썬 객체에는 흔하다.

Pablo Mescher
그는 8년 전 댓글을 달았습니다
0

필터링되지 호출 작동하지 않습니다. 아마도 @Julian 바로 쉐퍼드도 shouldn& # 39, 이렇게 할 수 없다.

Julian
그는 8년 전 댓글을 달았습니다
0

@Meitham 바로 이 점이었다 않했느뇨 it& # 39; d 포함시키십시오 그들을 you& # 39; d out of your 제외하려면 특별히 그 길을 가야 해요:). 어쨌든 좋은 파이썬 코드를 이럴 수 있어 최대 차이가 있지만 결코 철학, 백악 이 해야 할 일이다. 사용할 때, 그리고 명시적으로 컨테이너입니다 너희가운데 그리웠댔지 포함할 수 있습니다.

@Pablo 내가 didn& 말하는 것으로, t, t # 39 wouldn& # 39 작동합니까:), 어떤 주어진 @Meitham 게시하기를 (호출 등 '확실히' 노력해야 할).

Dave
그는 8년 전 댓글을 달았습니다
23

실제로 obj.dict (아마도) 는 이를 위해 보다.

Julian
그는 8년 전 댓글을 달았습니다
1

예, '는' dict 구축상의 상세함을. # 39 와 같은 일부 객체에는 don&, t ',' 한 '그래도 갖추지 객체에는 slots dir' 응답할 수 있습니다. 이후 ',' dir 표시되어도 괜찼습니다 제시하십시오 피쳐도 [방황케] (http://docs.python.org/library/functions.html # dir)

Julian
그는 8년 전 댓글을 달았습니다
0

내가 don& # 39, t know why SO isn& # 39, t 하는 나를 편집할지 그 마지막 주석문입니다, 그치만 이제 you& # 39, ve 변경한 것으로 될 수 없다. ',' 내 주석문입니다 주석문입니다 사용하여 obj.dict 있었다).

Meitham
그는 8년 전 댓글을 달았습니다
1

왜냐하면 내가 가진 것은 @pablo 호출 작동안함 잘못되었다는. 사과 드립니다. 여기서 k 는 호출 (k) 을 하고 난 그냥 구체화하십시오. 내가 누누이 호출 (the_method) 가 있는 나는 지금 내 오토메이티드 고정식입니다 그레타르 (obj ᄀ씨는). 사과를 할 경우 다시 혼란을 겪고 있습니다.

Cecil Curry
그는 5년 전 댓글을 달았습니다
5

@Julian '디렉터 ()' 만 &quot lies"; 통과 때 특성과 데코레이팅된 or 클래스뿐만 메타클라시스 (극단적인 면쪽 케이스) 에서 ['@DynamicClassAttribute'] (https://docs.python.org/3/library/types.html # 티페스트디노미클라사트리부트) (다른 익스프림 면쪽 경우). 두 경우 모두 래퍼 ' ()' 를 통해 해결할 수 있는 '디렉토리 ()' 이 제임스이제멤버스 부른다. 그러나, 표준 객체에는 solution& # 39 이 목록에 외곽진입 필터링부터 아웃해야 충분하니라 비사양 호출 absolutely 것이다. 이는 잘못된 것이라고 일부 피토니스타스 레이블에만 &quot idea"; 나를 배플 하지만. 예를 들어, 내가 각 자체?

Anton Tarasenko
그는 2년 전 댓글을 달았습니다
0

Var (목표) ',' 을 사용할 수도 있습니다. ',' 디렉터 (목표) '대신' dict 디스크입니다. 반품하십시오. https://stackoverflow.com/a/27181165/911945

    • 및 반복할 수 있는 방법을 일반적으로 "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'}

Jeff Xiao
그는 2년 전 댓글을 달았습니다
0

이 때 '2' 는 '정의' 와 '때만 한 후에 유르클레스 yc = ()'. 기존 아트리스 '에 관해 묻는 질문을 통해 루프을 유르클레스 ()'. 또한 '클래스' 를 하나의 솔루션으로 사용할 수 있는 유일한 양미신 일만은 아니다.

Nathan
그는 일 년 전 댓글을 달았습니다
2

'var (yc)' 를 통해 동일한 결과를 상속됩니다 않고도 다른 클래스.

속성 (기능ᆞ기술과 등) 에 '의 객체에는 파이썬 저장하는 딕트 불렀으매 dict'. 사용할 수 있습니다 (그러나 일반적으로 shouldn& # 39, t) 이 직접 속성뿐 액세스하려면. 그냥 바뀌엇어요 경우, '디렉터 (목표)' 을 반환하는지 이트레이블 호출할 수도 있습니다, 이는 모두 사용할 수 있는 속성 이름을 '그레타르' 를 전달하는 것입니다.

그러나 아무 것도 할 수 있는 변수 이름은 보통 필요로 하는 나쁜 설계. 왜안돼요 보관합니다 취합은?

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

그런 다음 함께 '키' 를 반복할 obj.special_values: 시동키는

Pablo Mescher
그는 8년 전 댓글을 달았습니다
0

설명할 수 있는 내가 원하는 것을 얻기 위해 조금 더 취합은 어떻게 사용합니까?

Pablo Mescher
그는 8년 전 댓글을 달았습니다
1

39, m not 속성 추가 i& 객체에는 무중단으로. 그러나 이 같은 com/go/4e6b330a_kr 나는 오래 남을 것 같아요 뭔가 좋은 일을 할 수 있는 어떤 조언들이요 내가 될 수 있는 것이 특징이다.

이미 언급한 바와 같이 일부 답변 / 설명, 파이썬 객체에는 사전을 저장할 이미 그들의 속성 (메서드을 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)

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

Pablo Mescher
그는 8년 전 댓글을 달았습니다
0

너무 복잡한 보인다. 만약 내가 어쩔 수 없다 하고, 어떤 i& 치중한다는 # 39 m, 차라리 지금.

39, 이 에로남이네 너회가 shouldn& 정답이 없다. 이 유형의 일은 그냥 스케쳐내 인컨텍스트 딕트 you& # 39, ll, 또는 사용하여 명시적으로 컨테이너입니다 특성을 추가할 필요가 있다. 전국적으로는 자동화합니다 학습에 대한 데코레이터 수 있습니다.

그나저나, 특히 method1 것처럼 좋은 환경에서 비유하사 속성의.

Pablo Mescher
그는 8년 전 댓글을 달았습니다
2

네, 저도 shouldn& # 39, t. 하지만 내 일도 파악할 수 있습니다. I come from php 배경 및 매일 이런 일을 수행하는 데 사용합니다.

Julian
그는 8년 전 댓글을 달았습니다
0

Sounds like a good time 분할하려면 오래된 습관을:)!

Pablo Mescher
그는 8년 전 댓글을 달았습니다
0

39 번 you& 나여야지 확신했다. 어느 때보다 훨씬 더 쉽게 답을 to_dict () 메서드를 업데이트되도록 계속 부진했다.

Henrik Vendelbo
그는 일 년 전 댓글을 달았습니다
0

모든 사람들이 남아 있는 발생합니까 독단적인 자제할 것이라고 조언을 아끼지 않았다. # 39 는 you& 경우 구우십시오 동적 프로그래밍 언어로, re 조심 하지 않으면 그 기능은 사용할 수 있습니다.

파이썬 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

not2qubit
그는 2년 전 댓글을 달았습니다
6

또한 일부 추가할 수 있도록 비전문 피토니츠 게시물이 설명 혜택을 받을 수 있는 답변을?

파이썬 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

Nathan
그는 일 년 전 댓글을 달았습니다
0

이 질문에 대한 두가지 해답있습니다 너회가 이유가 있나요?

Rubber Duck
그는 일 년 전 댓글을 달았습니다
0

그 중 하나가 더 자세한 정보 및 기타 피토니아노 @nathan 있기 때문이다. 난 또 didn& # 39 더 빠르게 실행할 수 있는, 그래서 내가 모르는 선택됨을 판독기에서 했다.

Rubber Duck
그는 일 년 전 댓글을 달았습니다
0

@nathan 제환자의 파이썬 또는 스택 오버플로입니다 경찰? 코딩 스타일이 다릅니다. 난 비 때문에 다양한 언어로, 기술 그리고 파이썬 포지셔닝하십시오 한 것 같은데 내가 일하는 특이한 경향이 있다. 저기서 보라그들은 간결하게 표현할 발열이 적고 있다. 그래서 왜안돼요 enlightened 판독기에서 허용할 모두?