2009-08-03 2 views
0

는 파이썬에서 클래스 메소드의 클래스에 않은 setattr 그런 짓을하고 싶어하지만, 클래스는 얻을 그래서 기본적으로 존재하지 않습니다 클래스를 수정하는 클래스 메소드를위한 방법은Python의 클래스 메소드에서 클래스를 수정하는 방법이 있습니까?

NameError: global name 'ClassName' is not defined 

있습니까? 그하지만 이런 식으로 뭔가가 실제로 작동 :

class Bla(object): 
    @classmethod 
    def cm(cls,value): 
     cls.storedValue = value 

Bla.cm("Hello") 

print Bla.storedValue # prints "Hello" 

편집이 : 내가 지금 당신의 문제를 이해 생각

class ClassName(object): 
    def HocusPocus(name): 
     setattr(ClassName, name, name) 

    HocusPocus("blah") 
    HocusPocus("bleh") 
+1

당신이하려는 것을 보여주는 작고 완전한 예를 게시하십시오. –

답변

5

클래스 메소드는 첫 번째 인수로 전달 된 클래스를 돌려줍니다. 내가 제대로 그것을 얻을 경우, 당신이 원하는 모든이있다 : 파이썬 (거의)에서

class Bla(object): 
    storedValue = "Hello again" 

print Bla.storedValue # prints "Hello again" 

클래스 생성은 단순히 의미

  1. 이 새로운 공간을 만듭니다.
  2. 이 네임 스페이스를 사용하여 클래스 본문 내에있는 코드를 실행하십시오.
  3. 네임 스페이스에 남아있는 모든 것을 클래스 특성으로 클래스에 넣으십시오. storedValue2 단계 이후의 네임 스페이스에 때문에 이러한에만 사용할 수 있습니다하지만

, 그것은, 3

+0

Bla의 몸체에서 cm을 실행하는 방법이 있습니까? – Pablo

+0

의도 한 결과가 아닙니다 (Bla는 아직 존재하지 않습니다). 그러나 클래스 생성시 클래스 속성 인 storedValue를 설정하려는 경우 bodyValue = "Hello"라고 말하면서 잘못 되었습니까? – balpha

+0

답변을 편집하십시오. – balpha

0

당신이 class decorator을 사용하는 것이 할 수있는 또 다른 방법 단계에서 class 속성으로 켜져 파이썬 2.6 이후부터 IIRC. 이 같은

뭔가 :

def addattributes(cls): 
    cls.foobar = 10 
    return cls 

@addattributes 
class MyClass(object): 
    pass 

print MyClass.foobar 

이 가장 유용 이런 종류의 당신은 어떤 특정 기능/특성을 가진 클래스의 수를 "장식"하고 싶다. 이 경우 한 번만 수행하려는 경우 앞에서 설명한대로 클래스 메서드를 사용하고 싶을 수 있습니다. 많은 좋은 제안이 진행되었지만

0

, 가장 가까운 사람이 원래 코드를 요청한 얻을 수 있습니다, 즉 : 나는 신비 ... 있으리라 믿고있어

class ClassName(object): 

    def HocusPocus(name): 
     return property(fget=..., fset=...) 

    blah = HocusPocus("blah") 
    bleh = HocusPocus("bleh") 

을 :

class ClassName(object): 
    def HocusPocus(name): 
     setattr(ClassName, name, property(fget=..., fset=...)) 

    HocusPocus("blah") 
    HocusPocus("bleh") 

이있다 수정 된 부분도 name에 액세스해야합니다 (그렇지 않으면 인수로 전달할 필요가 없습니다).

요점은 클래스 본문 내에서 HocusPocus는 여전히 함수입니다 (클래스 개체가 아직 실행되지 않았기 때문에 클래스 개체가 아직 존재하지 않으므로 본문은 본질적으로 해당 로컬에서 실행되는 함수 본문과 같습니다) dict [실제 함수의 지역 변수에서 일반적으로 파이썬 컴파일러가 수행하는 네임 스페이스 최적화 없이는 의미가 더 단순 해집니다!]) 특히 해당 본문 내에서 호출 될 수 있고 값을 반환 할 수 있으며 그 값을 할당 할 수 있습니다 (클래스 본문의 로컬 변수로, 본문 실행의 끝 부분에서 클래스 속성이됩니다) 등

당신은 ClassName.HocusPocus 당신이 클래스 본문 내에서의 실행을 완료 할 때 단지 del 문을 추가, 주위 나중에 매달려 원하지 않는 경우 (예를 들어, 클래스 본문의 마지막 문장 등) :

del HocusPocus 
+0

문제는 스스로 반복해야한다는 것입니다 : blah와 "blah". – Pablo

+0

다른 문제는 fget 및 fset을 작성하여 객체의 속성 이름을 가져오고 설정하는 방법이 표시되지 않는다는 것입니다. – Pablo

관련 문제