객체의 속성 나열


330

클래스의 인스턴스에 존재하는 속성 목록을 얻는 방법이 있습니까?

class new_class():
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

a = new_class(2)
print(', '.join(a.SOMETHING))

원하는 결과는 "multi, str"이 출력되는 것입니다. 스크립트의 여러 부분에서 현재 속성을보고 싶습니다.


75
파이썬의 거의 모든 사람들은 클래스 이름을 다음과 같이 지정 NewClass합니다. 와 같은 명명 규칙을 사용하면 사람들의 기대를 무시할 수 있습니다 new_class.
Mike Graham

휴먼 인터랙티브하고 프로그래밍 방식으로 사용할 수 없지만 help()함수는 클래스, 함수, 내장, 모듈 등에 대한 정보를 얻는 데 도움이됩니다.
ytpillai


'응답 됨'으로 표시된 답변이없는 이유는 무엇입니까?
pfabri

답변:


295
>>> class new_class():
...   def __init__(self, number):
...     self.multi = int(number) * 2
...     self.str = str(number)
... 
>>> a = new_class(2)
>>> a.__dict__
{'multi': 4, 'str': '2'}
>>> a.__dict__.keys()
dict_keys(['multi', 'str'])

pprint가 도움 이 될 수도 있습니다.


29
dict 사용법 의 문제는 r / python에 나타났습니다. 누군가 vars (a)는 a .__ dict__
David

5
궁금한 점이 있다면 Python 2.7에서도 작동합니다.
Ben Mordecai

8
구체적으로, pprint.pprint(a.__dict__)속성에 예쁘게 인쇄합니다.
smci

1
확실히 pprint파이썬 2.6에서는 작동하지 않습니다.
John Greene

3
이것은 내장 또는 확장 유형이 아닌 사용자 정의 클래스에서만 작동합니다.
ivan_pozdeev

173
dir(instance)
# or (same value)
instance.__dir__()
# or
instance.__dict__

그런 다음로 어떤 유형이 있는지 type()또는로 메소드 인지 테스트 할 수 있습니다 callable().


디렉토리가 과부하 속성의 get / 세트 수업에 더 나은 일
ogurets

dir (instance)에는 관심이없는 많은 것들이 있습니다
jciloa

이것은 나에게 모든 가능한 속성 가지고있는 유일한 기능이었다 bostonsklearn에서 데이터 집합을 - __dict__한 빈, 사실 5 개 사용 가능한 속성이있을 때
Coruscate5


53

이전의 모든 답변이 정확합니다. 자신의 질문에 대한 세 가지 옵션이 있습니다

  1. dir()

  2. vars()

  3. __dict__

>>> dir(a)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'multi', 'str']
>>> vars(a)
{'multi': 4, 'str': '2'}
>>> a.__dict__
{'multi': 4, 'str': '2'}

1
vars(foo)반환foo.__dict__
보리스

32
>>> ', '.join(i for i in dir(a) if not i.startswith('__'))
'multi, str'

이것은 물론 클래스 정의의 모든 메소드 또는 속성을 인쇄합니다. 로 변경 i.startwith('__')하여 "비공개"방법을 제외 할 수 있습니다i.startwith('_')


24

검사 모듈은 객체를 검사하는 쉬운 방법을 제공합니다 :

inspect 모듈은 모듈, 클래스, 메서드, 함수, 트레이스 백, 프레임 객체 및 코드 객체와 같은 라이브 객체에 대한 정보를 얻는 데 도움이되는 몇 가지 유용한 함수를 제공합니다.


를 사용 getmembers()하면 클래스의 모든 속성과 해당 값을 볼 수 있습니다. 개인 또는 보호 된 속성을 제외하려면을 사용하십시오 .startswith('_'). 제외 할 방법이나 기능을 사용 inspect.ismethod()하거나 inspect.isfunction().

import inspect


class NewClass(object):
    def __init__(self, number):
        self.multi = int(number) * 2
        self.str = str(number)

    def func_1(self):
        pass


a = NewClass(2)

for i in inspect.getmembers(a):
    # Ignores anything starting with underscore 
    # (that is, private and protected attributes)
    if not i[0].startswith('_'):
        # Ignores methods
        if not inspect.ismethod(i[1]):
            print(i)

메모 ismethod()의 번째 요소에 사용되는 i첫 번째 사람은 단순히 캐릭터 (이름)이다.

주제 : 클래스 이름으로 CamelCase 를 사용하십시오 .


13

dir(your_object)속성 getattr(your_object, your_object_attr)을 얻고 값을 얻는 데 사용할 수 있습니다

사용법 :

for att in dir(your_object):
    print (att, getattr(your_object,att))

객체에 __dict__가없는 경우 특히 유용합니다. 그렇지 않은 경우 var (your_object) 시도해 볼 수도 있습니다


11

사용해야하는 전체 속성 목록을 나열하는 경우가 종종 있습니다 dir(). 그러나 대중의 신념과 달리 모든 속성 dir()이 나오지는 않습니다 . 예를 들어 , 클래스 자체에서 액세스 할 수 있지만 클래스 목록 에서 누락 될 수 있습니다 . 문서에서 ( Python 2 , Python 3__name__dir()dir() ) :

dir ()은 주로 대화식 프롬프트에서 사용하기 편리하게 제공되므로 엄격하거나 일관되게 정의 된 이름 세트를 제공하는 것보다 흥미로운 이름 세트를 제공하려고 시도하며 자세한 동작은 릴리스마다 변경 될 수 있습니다. 예를 들어, 인수가 클래스 인 경우 메타 클래스 속성이 결과 목록에 없습니다.

다음과 같은 함수는 더 완벽한 경향이 있지만 메소드가 dir()구현 되거나 클래스를 __dir__()정의 __getattr__()하거나 __getattribute__()클래스 또는 그 부모 중 하나에 포함되어있는 많은 요인에 의해 반환되는 목록 이 영향을 줄 수 있기 때문에 완전성을 보장 할 수는 없습니다 . 자세한 내용은 제공된 링크를 참조하십시오.

def dirmore(instance):
    visible = dir(instance)
    visible += [a for a in set(dir(type)).difference(visible)
                if hasattr(instance, a)]
    return sorted(visible)

9

무엇을 원하십니까? 정확한 의도를 알지 못하면 최상의 답변을 얻는 것이 어려울 수 있습니다.

  • 클래스의 인스턴스를 특정 방식으로 표시하려면 항상 수동으로 수행하는 것이 좋습니다. 여기에는 원하는 것을 정확하게 포함하고 원하지 않는 것을 포함하지 않으며 순서를 예측할 수 있습니다.

    클래스의 내용을 표시하는 방법을 찾고 있다면 관심있는 속성의 형식을 수동으로 지정하고이를 클래스의 __str__또는 __repr__메서드로 제공하십시오.

  • 객체가 어떻게 작동하는지 이해하기 위해 어떤 방법과 그 방법에 대해 배우려면를 사용하십시오 help. help(a)docstring을 기반으로 객체의 클래스에 대한 형식화 된 출력을 보여줍니다.

  • dir프로그래밍 방식으로 객체의 모든 속성을 가져 오기 위해 존재합니다. (액세스 __dict__는 내가 같은 것으로 그룹화하지만 내가 사용하지 않는 것을 수행합니다.) 그러나 여기에는 원하는 것이 포함되지 않을 수도 있고 원하지 않는 것이 포함될 수도 있습니다. 신뢰할 수 없으며 사람들은 자신이 원하는 것보다 더 자주 원한다고 생각합니다.

  • 다소 직교하는 메모에서 현재 파이썬 3에 대한 지원은 거의 없습니다. 실제 소프트웨어 작성에 관심이 있다면 numpy, lxml, Twisted, PIL 또는 아직 Python 3을 지원하지 않고 너무 빨리 계획이없는 웹 프레임 워크와 같은 타사 제품을 원할 것입니다. 2.6과 3.x 분기의 차이는 작지만 라이브러리 지원의 차이는 매우 큽니다.


4
나는 5 년 후에 (현재) 언급 한 모든 타사 모듈이 python3을 지원한다고 생각합니다. 출처 : python3wos.appspot.com
pzkpfw

8

여러 가지 방법이 있습니다.

#! /usr/bin/env python3
#
# This demonstrates how to pick the attiributes of an object

class C(object) :

  def __init__ (self, name="q" ):
    self.q = name
    self.m = "y?"

c = C()

print ( dir(c) )

실행될 때이 코드는 다음을 생성합니다.

jeffs@jeff-desktop:~/skyset$ python3 attributes.py 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',      '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm', 'q']

jeffs@jeff-desktop:~/skyset$

2
이 답변이 다운 보트 된 이유는 무엇입니까? 디버깅 목적으로 dir은 꽤 잘 작동합니다!
Dunatotatos

Python 2.7.x와 함께 작동합니다. 정확히 내가 원하는 것.
Davidson Lima

7

순서대로 실행 된 python shell 스크립트를 참조하십시오. 여기에서 쉼표로 구분 된 문자열 형식의 클래스 속성을 얻을 수 있습니다.

>>> class new_class():
...     def __init__(self, number):
...         self.multi = int(number)*2
...         self.str = str(number)
... 
>>> a = new_class(4)
>>> ",".join(a.__dict__.keys())
'str,multi'<br/>

파이썬 3.4를 사용하고 있습니다


그리고 당신이 원하는 경우에만 목록을 사용할 수 있습니다 a.__dict__.keys(). 그러나 객체에 특정 속성이 있는지 알고 싶다면 사용할 수 있습니다 hasattr.
berna1111

4

이 답변 외에도 거의 모든 값의 전체 구조를 뿜어내는 기능 (파이썬 3)을 포함시킬 것입니다. 그것은 사용 dir후, 속성 이름의 전체 목록을 설정하는 데 사용하는 getattr각각의 이름으로. 값의 모든 멤버 유형을 표시하고 가능한 경우 전체 멤버도 표시합니다.

import json

def get_info(obj):

  type_name = type(obj).__name__
  print('Value is of type {}!'.format(type_name))
  prop_names = dir(obj)

  for prop_name in prop_names:
    prop_val = getattr(obj, prop_name)
    prop_val_type_name = type(prop_val).__name__
    print('{} has property "{}" of type "{}"'.format(type_name, prop_name, prop_val_type_name))

    try:
      val_as_str = json.dumps([ prop_val ], indent=2)[1:-1]
      print('  Here\'s the {} value: {}'.format(prop_name, val_as_str))
    except:
      pass

이제 다음 중 하나가 통찰력을 제공해야합니다.

get_info(None)
get_info('hello')

import numpy
get_info(numpy)
# ... etc.

와우, 그게 보석이야!
pfabri

그래, 이것은 생명의 은인이었다. 이 목록을 쉽게 풀 수없는 이유를 알 수 없었으며 충분한 유형에 "tuple"유형의 " slots " 속성이 있는지 확인하십시오 . 슬롯 값 은 다음과 같습니다 . [ "nsname", "hostmaster", "serial", "refresh", "재시도", "만료", "minttl", "ttl"]
Mik R

3

객체의 속성을 가져옵니다

class new_class():
    def __init__(self, number):
    self.multi = int(number) * 2
    self.str = str(number)

new_object = new_class(2)                
print(dir(new_object))                   #total list attributes of new_object
attr_value = new_object.__dict__         
print(attr_value)                        #Dictionary of attribute and value for new_class                   

for attr in attr_value:                  #attributes on  new_class
    print(attr)

산출

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__','__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'multi', 'str']

{'multi': 4, 'str': '2'}

multi
str

1

사용하기 전에 작성된 것처럼 obj.__dict__일반적인 경우를 처리 할 수 ​​있지만 일부 클래스에는 __dict__속성과 사용 이 없습니다 __slots__(대부분 메모리 효율성을 위해).

이 작업을보다 탄력적으로 수행하는 예 :

class A(object):
    __slots__ = ('x', 'y', )
    def __init__(self, x, y):
        self.x = x
        self.y = y


class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y


def get_object_attrs(obj):
    try:
        return obj.__dict__
    except AttributeError:
        return {attr: getattr(obj, attr) for attr in obj.__slots__}


a = A(1,2)
b = B(1,2)
assert not hasattr(a, '__dict__')

print(get_object_attrs(a))
print(get_object_attrs(b))

이 코드의 출력 :

{'x': 1, 'y': 2}
{'x': 1, 'y': 2}

Note1 :
파이썬은 동적 인 언어이며,이 코드조차도 일부 경우를 놓칠 수 있기 때문에 속성을 얻으려는 클래스를 항상 잘 아는 것이 좋습니다.

참고 2 :
이 코드는 클래스 변수가 제공되지 않음을 의미하는 인스턴스 변수 만 출력합니다. 예를 들면 다음과 같습니다.

class A(object):
    url = 'http://stackoverflow.com'
    def __init__(self, path):
        self.path = path

print(A('/questions').__dict__)

코드 출력 :

{'path': '/questions'}

이 코드는 url클래스 속성을 인쇄하지 않으며 원하는 클래스 속성을 생략 할 수 있습니다.
때로는 속성이 인스턴스 멤버라고 생각할 수도 있지만이 예제를 사용하여 표시되지 않을 수도 있습니다.


2
클래스는 가질 수 __dict__ __slots__ 아마 당신은 단지 DICT보다는 모두 시도 할 수 있도록.
체코

1
  • 누락 되었기 때문에 사용 __dict__또는 vars 작동하지 않습니다__slots__ .
  • 사용 __dict____slots__ 작동하지 않습니다 그것을 놓치고 있기 때문에 __slots__기본 클래스에서.
  • 메소드 또는 특성과 같은 클래스 속성 및 오브젝트 속성을 포함하므로 사용 dir 이 작동하지 않습니다 .
  • 사용은를 사용 vars하는 것과 같습니다 __dict__.

이것이 내가 가진 최고입니다 :

from typing import Dict

def get_attrs( x : object ) -> Dict[str, object]:
    mro      = type( x ).mro()
    attrs    = { }
    has_dict = False
    sentinel = object()

    for klass in mro:
        for slot in getattr( klass, "__slots__", () ):
            v = getattr( x, slot, sentinel )

            if v is sentinel:
                continue

            if slot == "__dict__":
                assert not has_dict, "Multiple __dicts__?"
                attrs.update( v )
                has_dict = True
            else:
                attrs[slot] = v

    if not has_dict:
        attrs.update( getattr( x, "__dict__", { } ) )

    return attrs

간단한 클래스에이 함수를 적용 해 봅시다 : class C : def __init __ (self) : print ( "created") i = 42 왜 당신의 코드가 그런 클래스에 대해 빈리스트를 제공합니까? 또한 ( "mystr") get_attrs 위해 한 (O = C () 다음 get_attrs (O)가 비어있는 경우 내 말)
검정 고시

0
attributes_list = [attribute for attribute in dir(obj) if attribute[0].islower()]

대문자 나 단일 밑줄로 시작하는 클래스 속성 이름에는 작동하지 않습니다.
fviktor

0

다음 Python 쉘 스크립팅 실행을 순서대로 참조하십시오. 클래스 생성에서 인스턴스의 필드 이름 추출에 이르기까지 솔루션을 제공합니다.

>>> class Details:
...       def __init__(self,name,age):
...           self.name=name
...           self.age =age
...       def show_details(self):
...           if self.name:
...              print "Name : ",self.name
...           else:
...              print "Name : ","_"
...           if self.age:
...              if self.age>0:
...                 print "Age  : ",self.age
...              else:
...                 print "Age can't be -ve"
...           else:
...              print "Age  : ","_"
... 
>>> my_details = Details("Rishikesh",24)
>>> 
>>> print my_details
<__main__.Details instance at 0x10e2e77e8>
>>> 
>>> print my_details.name
Rishikesh
>>> print my_details.age
24
>>> 
>>> my_details.show_details()
Name :  Rishikesh
Age  :  24
>>> 
>>> person1 = Details("",34)
>>> person1.name
''
>>> person1.age
34
>>> person1.show_details
<bound method Details.show_details of <__main__.Details instance at 0x10e2e7758>>
>>> 
>>> person1.show_details()
Name :  _
Age  :  34
>>>
>>> person2 = Details("Rob Pike",0)
>>> person2.name
'Rob Pike'
>>> 
>>> person2.age
0
>>> 
>>> person2.show_details()
Name :  Rob Pike
Age  :  _
>>> 
>>> person3 = Details("Rob Pike",-45)
>>> 
>>> person3.name
'Rob Pike'
>>> 
>>> person3.age
-45
>>> 
>>> person3.show_details()
Name :  Rob Pike
Age can't be -ve
>>>
>>> person3.__dict__
{'age': -45, 'name': 'Rob Pike'}
>>>
>>> person3.__dict__.keys()
['age', 'name']
>>>
>>> person3.__dict__.values()
[-45, 'Rob Pike']
>>>

각 속성의 callablilty를 확인할 수도 있습니다. stackoverflow.com/questions/1398022/…
hygull

-4

__attr__ 인스턴스의 속성 목록을 제공합니다.

>>> import requests
>>> r=requests.get('http://www.google.com')
>>> r.__attrs__
['_content', 'status_code', 'headers', 'url', 'history', 'encoding', 'reason', 'cookies', 'elapsed', 'request']
>>> r.url
'http://www.google.com/'
>>>

항상 작동하지는 않습니다. 또한 __attr__설명에는 쓰지만 __attrs__코드 에는 사용 합니다. 나도 일하지 않았다 (werkzeug.datastructures.FileStorage)
Jonas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.