2017-12-24 20 views
0

저는 객체를 인수로 취하는 hasattr 메소드를보고있었습니다.hasattr이 함수에 속성이 있는지 확인합니다.

"모든 것이 대상입니다"이론을 확인하십시오. 나는 속성이 "name" 인 사용자 정의 함수를 만들었지 만 False을 반환합니다. 내가 작성한 코드는 다음과 같습니다.

def trial(): 
    name = "james" 

hasattr(trial, "name") 

즉, 함수가 객체가 아니라는 의미입니까? 누군가가 우리가 이것을 이해하도록 도울 수 있다면 고맙겠습니다.

+6

이 함수는 객체이지만'name'은 속성이 아닙니다. 'name'은'trial()'함수가 실행될 때 생성되는 변수입니다. 함수는 객체이며 속성을 가지고 있지만 로컬 변수는 속성이 아닙니다. – khelwood

+1

예를 들어, 함수 정의와 검사 사이에'trial.name = 'James''를 추가하면 그것이 사실임을 알 수 있습니다. – jonrsharpe

+0

'name'속성을 가진 함수가 없습니다. –

답변

1

기능 개체입니다,하지만 당신이 만든 것은 하지 그 함수의 속성 인 지역 변수name있는 기능입니다. 의 함수 코드를 검사 보자

>>> trial.__code__.co_varnames 
('name',) 

당신이 볼 수 있듯이, name 실제로 함수의 지역 변수입니다.

그러나, 여전히 기능을 정의 할 수 있습니다 속성 :

>>> def trial(): 
...  name = "james" 
... 
>>> trial.foo = 'bar' 
>>> hasattr(trial, 'foo') 
True 
>>> getattr(trial, 'foo') 
'bar' 

함수에 속성을 할당하는 방법입니다 그냥 수 있습니다 기타 다른 객체처럼, <func>.<attr_name> = <attr_value> 말에 의해.

되지 않습니다 (이 반드시 원하는 결과를 달성하는 가장 좋은 방법이다라고하지만, 그냥이 가능 데모로하지 않음)

1

파이썬에서 함수가 실제로 함수의 개체하지만 지역 변수 인 그것의 재산. 코드의 끝 부분이 추가

봅니다 :

>>> trial.__dir__() 

그것은 당신에게 당신이 정의 된 함수의 모든 속성을 표시합니다 - 당신은 함수 객체의 속성에 액세스하고 있습니다.

원하는 경우 함수 개체에 속성을 추가 할 수도 있지만 기존 속성을 덮어 쓰지 않도록주의해야합니다. 이 시도 :

코드가 실행되는
>>> trial.foo = 'bar' 
>>> dir(trial) # Equivalent to trial.__dir__(). 'foo' is now in the list. 
>>> hasattr(trial, 'foo') 
>>> print(trial.foo) 

는 함수가 정의 순간부터 확실한 뭔가가됩니다 만의 변수 만의 기간 동안 그들은 메모리에 저장된 값은 의미에서 임시 있습니다 함수 실행 (즉, 호출 할 때)이 끝나면 사라집니다. 실제로는 믹스에서 가비지 콜렉션을 사용하여 그보다 조금 더 복잡하지만, 간단한 관점에서 볼 때, 그 일은 거의 발생합니다.