2017-02-21 3 views
0

큰 일을하기를 바랍니다. 이 질문은 실제로 기본 클래스에 대한 참조를 제거하는 것입니다.부모의 클래스 이름없이 부모 클래스의 메서드 참조

기본적으로 부모 클래스 메서드를 사용하여 인스턴스 수준 대신 클래스 수준에서 자식 클래스 메서드의 모든 메서드를 수집하려고합니다. 그러나 기본 클래스 이름이 정말 길다는 말을 들었습니다.

첫 번째 작품은 긴 이름 때문에 실제로 작동하지만 귀찮았습니다. 깨끗한 버전에서도 매번 A.eat를해야합니다.

저는 사람들이 B와 같은 다른 아이에서 "먹는"다른 방법을 정의하지 않겠다고 약속합니다. 실제로 @ class를 사용할 수 있도록 기본 클래스 참조를 제거 할 수 있습니까?

class IDontWantToDoThisButNameHasToBeThisLong(object): 

    a = [] 

    @classmethod 
    def eat(cls, func): 
    cls.a.append(func) 


class B(IDontWantToDoThisButNameHasToBeThisLong): 

    @IDontWantToDoThisButNameHasToBeThisLong.eat 
    def apple(self, x): 
    print x 

    IDontWantToDoThisButNameHasToBeThisLong.eat(lambda x: x+1) 

x = B() 

IDontWantToDoThisButNameHasToBeThisLong.a[0](x, 1) 

print IDontWantToDoThisButNameHasToBeThisLong.a[1](1) 

클린 버전 :

감사
class A(object): 

    a = [] 

    @classmethod 
    def eat(cls, func): 
    cls.a.append(func) 


class B(A): 

    @A.eat 
    def apple(self, x): 
    print x 

    A.eat(lambda x: x+1) 

x = B() 

A.a[0](x, 1) 
print A.a[1](1) 

,

답변

0

클래스 IDontWantToDoThisButNameHasToBeThisLong 정말 그냥 객체입니다. 파이썬에서는 대부분의 객체가 객체이기 때문에 클래스를 포함하여 변수에 할당 할 수 있습니다. 당신이 여기에서 무엇을 할 수 있는지

는 다음

class IDontWantToDoThisButNameHasToBeThisLong(object): 

    a = [] 

    @classmethod 
    def eat(cls, func): 
     cls.a.append(func) 

A = IDontWantToDoThisButNameHasToBeThisLong 


class B(A): 

    @A.eat 
    def apple(self, x): 
     print x 

    A.eat(lambda x: x+1) 

x = B() 

IDontWantToDoThisButNameHasToBeThisLong.a[0](x, 1)   
A.a[0](x, 1) 

print IDontWantToDoThisButNameHasToBeThisLong.a[1](1) 
0

당신이 원하는 무엇을위한 완벽한 솔루션이 없다 같은 것입니다,하지만 충분 수있는 몇 가지 방법이있다.

간단한 시작하려면, 당신은 자식 클래스에서 클래스 메소드를 사용하기 전에 긴 클래스에게 짧은 이름을 줄 수 :

class IDontWantToDoThisButNameHasToBeThisLong(object): 
    ... 

A = IDontWantToDoThisButNameHasToBeThisLong 

# later code can use A.whatever() 

또 다른 옵션은 오랫동안 함께 클래스에서 데코레이터를 이동하는 것 이름을 사용하여 나중에 코드가 클래스 메소드가 아닌 전역 클래스로 직접 참조하도록합니다. 그 두 가지의

class IDontWantToDoThisButNameHasToBeThisLong(object): 
    a = [] 

def eat(func): 
    IDontWantToDoThisButNameHasToBeThisLong.a.append(func) # only need to use the name once 
    return func # I suspect you want this too (a decorator should return a callable) 

# later code can use @eat as a decorator, without referring to the long class name 

하이브리드 : 약간 (혹시 다른 클래스를 통해 호출 같은 장식을 통해 액세스하는 여러 다른 a 목록으로 거기하려는 경우 문제를 일으킬 수 있음) 재 설계 할 필요 접근 방식은 그대로 기존의 클래스 메소드의 정의를두고 있지만, 액세스에 쉽게 바인딩 방법에 대한 또 다른 글로벌 이름을 만들 수 있습니다 :

eat = IDontWantToDoThisButNameHasToBeThisLong.eat 

마지막으로 가능한 방법은 경우 (애호가 메타 클래스 프로그래밍, 또는를 사용하는 것 당신은 파이썬 3.6을 사용하고 있습니다.) __init_subclass__ 또는 이와 유사한, 아치 이브는 클래스 메소드를 데코레이터로 사용하지 않고도 염두에 두어야 할 목표입니다. 코드를 포함시키지 않을 것입니다. 왜냐하면 이렇게하는 가장 좋은 방법은 아마도 여러분의 예제에서 보여준 것보다 더 자세한 디자인에 달려 있기 때문입니다.

관련 문제