2010-03-23 5 views
9

클래스 특수 메서드를 재정의하려면 어떻게해야합니까?Python이 클래스가 아닌 (인스턴스가 아닌) 특수 메서드를 재정의합니다.

인스턴스를 만들지 않고 클래스의 __str__() 메서드를 호출 할 수 있기를 원합니다. 예 :

class Foo: 
    def __str__(self): 
     return 'Bar' 

class StaticFoo: 
    @staticmethod 
    def __str__(): 
     return 'StaticBar' 

class ClassFoo: 
    @classmethod 
    def __str__(cls): 
     return 'ClassBar' 

if __name__ == '__main__': 
    print(Foo) 
    print(Foo()) 
    print(StaticFoo) 
    print(StaticFoo()) 
    print(ClassFoo) 
    print(ClassFoo()) 

는 생산 :

<class '__main__.Foo'> 
Bar 
<class '__main__.StaticFoo'> 
StaticBar 
<class '__main__.ClassFoo'> 
ClassBar 

은 다음과 같아야합니다

Bar 
Bar 
StaticBar 
StaticBar 
ClassBar 
ClassBar 

을 나는 @staticmethod 또는 @classmethod__str__ 여전히 사용하고 사용하는 경우에도 내장 된 파이썬 정의 __str__. Foo.__str__() 대신 Foo().__str__() 일 때만 작동합니다.

+0

-1 : "인스턴스를 만들지 않고 클래스의 __str __() 메소드를 호출하십시오." 누구든지 물건이 무엇인지에 대한 모든 이해를 끊어 버립니다. 제발 하지마. 프로그램이 우리의 가장 근본적인 기대에 절대적으로 위배됩니다. –

+5

나는 동의하지 않는다. str (MyClass)을 호출하면 str (myClassObject)를 호출 한 것처럼 동작 할 것이라고 기대할 이유가 없습니다. 다시 말하면 근본적인 기대는 없습니다. 나는 그가 정적 클래스를 만들고자하고 결코 그것의 인스턴스를 만들 의도가 없다고 생각한다. –

답변

17

클래스에서 정의 된 특수 메서드 __str__은 해당 클래스의 인스턴스에 대해서만 작동하며 클래스 개체에 대해 다른 동작을 갖기 위해 해당 클래스의 메타 클래스에서 수행해야합니다. (파이썬 2.5)

class Meta(type): 
    def __str__(self): 
     return "Klass" 

class A(object): 
    __metaclass__ = Meta 

    def __str__(self): 
     return "instance" 

print A 
print A() 

출력 : 난 당신이 정확하게 뭘 하려는지 모르겠어요

Klass 
instance 
+1

클래스 C (metaclass = M)의 새로운 py3 구문을 사용해야했습니다 : ... 하지만 작동합니다! –

1

__str__의 의미를 남용하고 싶습니까? 이 메서드는 "이 인스턴스"의 문자열 표현을 반환합니다.

정적 문자열 만 반환하는 함수를 원한다면 클래스 내부가 아닌 별도의 함수로 사용하는 것이 좋습니다.

새 문자열을 반환하는 생성자를 원한다면 예약 된 __str__ 이름을 위장하지 않도록 다른 이름을 지정하십시오.

0

. 그냥 약간의 임의 정보를 추가하겠습니다.

첫째,이 클래스 추가 :

class FooNew(object): 
def __str__(self): 
    return 'Fubar' 

인쇄이 대신 :

You are calling type for an old style class 
__main__.Foo 
<class __main__.Foo at 0xb73c9f5c> 
Bar 
But my Python 2.6 didn't match your output for print(Foo) 
You are calling object.str() for a new style class 
<class '__main__.FooNew'> 
<class '__main__.FooNew'> 
Fubar 
Why do you want to change this? 

것은 당신이 절대적으로 당신이 전화하고 싶지 않은 항목입니다

if __name__ == '__main__': 
    print "You are calling type for an old style class" 
    print(Foo) 
    print(type.__str__(Foo)) 
    print(Foo()) 
    print("But my Python 2.6 didn't match your output for print(Foo)") 
    print("You are calling object.str() for a new style class") 
    print(FooNew) 
    print(object.__str__(FooNew)) 
    print(FooNew()) 
    print("Why do you want to change this?") 

을이를 얻으려면 classmethod?

관련 문제