속성이며 방법 인 DIR에 나열된 속성 및 메소드 목록을 볼 때 어떻게 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/880160

문제

나는 Python에서 프로그래밍하는 법을 배우려고 노력하고 있으며 표준 및 기타 모듈 사용 방법을 더 잘 처리하는 데 중점을 둡니다. DIR 기능은 통역사에서 정말 강력 해 보이지만 OOP 배경이 부족하여 무언가를 놓치고 있는지 궁금합니다. S.Lotts Book을 사용하여 Die 클래스를 사용하여 클래스 및 인스턴스의 구문 및 사용에 대해 더 많이 배우기로 결정했습니다.

원래 코드는 다음과 같습니다.

class Die(object):
''' simulate a six-sided die '''
def roll(self):
    self.value=random.randrange(1,7)
    return self.value
def getValue(self):
    return self.value

나는 그것을보고 있었고 몇 가지 인스턴스를 만든 후에는 단어 값이 어떻게 든 키워드인지, 클래스 문에서 단어 객체의 사용이 무엇인지 궁금해했으며 클래스 정의를 다음과 같이 변경하여 찾기로 결정했습니다.

class Die():
''' simulate a six-sided die '''
def roll(self):
    self.ban=random.randrange(1,7)
    return self.ban
def getValue(self):
    return self.ban

그 변화는 내가 인스턴스에서 동일한 동작을 얻었음을 보여 주었지만 다음과 같은 방법/속성은 내가 DIR을했을 때 인스턴스에서 누락되었습니다.

'__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
 '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
_repr__', '__setattr__', '__str__', '__weakref__'

또한 인스턴스에 딥을했을 때 추가 키워드가 있음을 알았습니다. 마침내 알아 차린 것은 내 인스턴스의 속성이라고 생각했습니다. 이것은 내가 사용할 수 있다는 것을 이해하는 데 도움이되었습니다 D1.BAN 내 인스턴스의 값에 액세스하려면 이것이 속성이라는 것을 알아낼 수있는 유일한 이유는 내가 입력 한 것입니다. D1. 행복 그리고 얻었습니다 AttributeError 나는 그것을 알아 냈다 d1.getValue 통역사가 나에게 말한 것이기 때문에 다이에 첨부 된 방법이었습니다.

따라서 BeautifulSoup과 같은 복잡하지만 유용한 모듈을 사용하려고 할 때, 나열된 내용 중 어느 것이 내 인스턴스의 속성인지 입력 한 후 인스턴스의 방법을 알 수 있습니까? dir (인스턴스). 이 찌르기가 속성으로 나는 방법의 결과를 호출하고 메소드에서 내 인스턴스에서 함수를 호출하고 있다고 가르쳐 주었기 때문에 이것을 알아야합니다.

이 질문은 아마도 너무 말이 많지만 속성과 방법의 차이점을 더 잘 이해하는 데 도움이되었습니다. 구체적으로, 내 다이 클래스의 인스턴스에서 Dir를 부르는 결과를 볼 때 나는 이것을 본다.

['__doc__', '__module__', 'ban', 'getValue', 'roll']

따라서 속성이며 시행 착오에 의지하거나 타이핑에 의존하지 않고도 방법 인 목록을 보면 아는 것이 유용한 것 같습니다. Hasattr (MyInstance, 의심되는 AttriptributeName).

질문을 게시 한 후 시도했습니다

for each in dir(d1):
    print hasattr(d1,each)

모든 방법이 속성이라고 말하면됩니다. 그러나 나는없이 방법을 호출 할 수 없다 () 그래서 hasattr ()가 오해의 소지가있는 것 같습니다.

도움이 되었습니까?

해결책

대신에: "print hasattr(d1,each)", 노력하다: "print each, type(getattr(d1,each))". 당신은 유익한 결과를 찾아야합니다.

또한 대신 dir() 노력하다 help(), 당신이 정말로 찾고 있다고 생각합니다.

다른 팁

표준 라이브러리 사용을 고려하십시오 inspect 모듈-종종 내성에 대한 가장 어려운 접근 방식이며, 실질적인 기능 덩어리를 포장하는 경우가 많습니다 (처음부터 구현할 수 있지만 잘 테스트 된 잘 지정된 코드를 재사용하는 것은 좋은 일입니다). 보다 http://docs.python.org/library/inspect.html 모든 세부 사항은 예를 들어입니다 inspect.getmembers(foo, inspect.ismethod) FOO의 모든 방법을 얻는 훌륭한 방법입니다 ( (name, value) 이름으로 정렬 된 쌍).

모든 방법이 속성이라고 말하면됩니다. 그러나 나는 () 없이는 메소드를 부를 수 없으므로 hasattr ()가 오도하는 것처럼 보입니다.

왜 오해의 소지가 있습니까? 만약에 obj.ban() 그렇다면 방법입니다 obj.ban 해당 속성입니다. 다음과 같은 코드를 가질 수 있습니다.

print obj.getValue()

또는

get = obj.getValue
print get()

객체에서 메소드 목록을 얻으려면이 기능을 시도 할 수 있습니다. 방법이 아닌 호출 가능한 속성을 유발할 것이기 때문에 완벽하지는 않지만 99%의 경우 충분해야합니다.

def methods(obj):
    attrs = (getattr(obj, n) for n in dir(obj))
    return [a for a in attrs if a.hasattr("__call__")]

이것 info Python으로 Dive에서 영감을 얻은 모듈은 목적을 제공합니다.

def info(obj, spacing=20, collapse=1, variables=False):
    '''Print methods and their doc Strings

    Takes any object'''
    if variables:
    methodList = [method for method in dir(obj)]
    else:
    methodList = [method for method in dir(obj) if callable(getattr(obj,method))]

    #print methodList


    print '\n'.join(['%s %s' %
            (method.ljust(spacing),
             " ".join(str(getattr(obj,method).__doc__).split()))
            for method in methodList])


if __name__=='__main__':
    info(list)

Callable이라는 내장 방법이 있습니다. 모든 객체에 적용 할 수 있으며 호출 할 수 있는지에 따라 True/False를 반환합니다. 예를 들어

>>> def foo():
...   print "This is the only function now"
...
>>> localDictionary = dir()
>>> for item in localDictionary:
...   print repr(item) + "is callable: " + str(callable(locals()[item]))
'__builtins__'is callable: False
'__doc__'is callable: False
'__name__'is callable: False
'foo'is callable: True

참고 Locals () 호출은 현재 범위에 정의 된 모든 것을 포함하는 사전을 반환합니다. 사전의 항목이 단지 끈이기 때문에이 작업을 수행했으며 실제 객체에서 호출 가능해야합니다.

이상적으로는 BeautifulSoup과 같은 복잡한 라이브러리를 사용할 때 문서를 참조하여 각 수업이 제공하는 방법을 확인해야합니다. 그러나 쉽게 액세스 할 수있는 문서가없는 드문 경우에는 다음을 사용하여 메소드가 있는지 확인할 수 있습니다.

그 자체가 객체 인 모든 방법은 __call__ 메소드를 반환하는 Callable () 메소드를 사용하여 확인할 수 있습니다. True, 확인중인 값이 __call__ 방법.

다음 코드가 작동해야합니다.

x = Die()
x.roll()

for attribute in dir(x) :
    print attribute, callable(getattr(x, attribute))

위의 코드는 모든 메소드에 대해 true를 반환하고 모든 호출 할 수없는 속성 (금지와 같은 데이터 구성원)에 대해 FALSE를 반환합니다. 그러나이 방법도 반환됩니다 True 내부 클래스와 같은 호출 가능한 객체의 경우. 속성 유형이 있는지 확인할 수도 있습니다. instancemethod

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top