2012-02-26 2 views
30
class MyClass: 
    def myFunc(self): 
     pass 

클래스 정의의 MyFunc outisde를 만들 수 있습니까? 어쩌면 다른 모듈에서도?Python은 클래스 정의 밖에서 메서드를 정의합니까?

+1

예 ... 당신은 당신이 (거의) 원하는 기능을하지만 목적을 정의 할 수 있습니다? 달성하고자하는 것은 무엇입니까? 클래스의 함수는 바깥의 함수와 다릅니다.함수가 생성 된 인스턴스를 참조하는 self 매개 변수의 사용 – aweis

+0

함수가 너무 많습니다. 사용자는 더 추가 할 수 있습니다. "클래스"는 기본적으로 유용한 도우미 함수의 컨테이너입니다. –

+0

하나의 클래스에 "도우미"함수 목록이 들어있는 상속을 사용하는 것 같습니다. 그런 다음 다른 클래스가이 클래스를 구현하고 그 클래스의 함수를 사용할 수 있습니다. – aweis

답변

51

예. 당신은 클래스의 외부에서 함수를 정의하고 다음 방법으로 클래스 본문에서 사용할 수 있습니다 : 정의 된 후 또한 클래스에 기능을 추가 할 수 있습니다

def func(self): 
    print "func" 

class MyClass(object): 
    myMethod = func 

:

class MyClass(object): 
    pass 

def func(self): 
    print "func" 

MyClass.myMethod = func 

원하는 경우 다른 모듈에서 함수와 클래스를 정의 할 수 있지만 한 모듈에서 클래스를 정의한 다음 다른 클래스에서 클래스를 가져 와서 동적으로 메소드를 추가하는 것이 좋습니다 (두 번째 예와 같이). 왜냐하면, 다른 모듈을 가져 왔는지 여부에 따라 클래스와 놀랍게도 다른 동작을합니다.

나는 이것이 파이썬에서 가능하지만 다소 특이한 내용이다. 사용자는 "사용자가 더 많은 메소드를 추가 할 수 있습니다"라는 주석을 언급합니다. 이상하게 들린다. 라이브러리를 작성하는 경우 라이브러리 사용자가 라이브러리의 클래스에 동적으로 메소드를 추가하지 못하게 할 수 있습니다. 라이브러리 사용자가 직접 클래스를 변경하는 것보다 클래스에서 상속 된 자체 서브 클래스를 만드는 것이 더 일반적입니다.

+0

선언 된 후에 클래스에 함수를 추가하는 더 짧은 방법이 있습니까? 왜냐하면 내부적으로 정의하는 것보다 더 단순하고 깨끗해 보이지 않기 때문입니다. (내가 아는 것은 아닙니다.) –

+0

확실히 깨끗하고 단순하게하려면 클래스 내부에 선언하십시오. 클래스가 정의 된 후에 함수를 추가 할 수있는 능력은 다소 수수께끼이며 어떤 이유로 런타임시 전체 클래스를 새로 작성해야하는 고급 상황에서 주로 사용됩니다. 당신이하고 싶은 일을 더 잘 설명해 주실 수 있습니까? 왜 학생들의 수업에는 여러 파일을 별도의 파일에 넣으려는 큰 방법이 있습니까? – Weeble

+0

'다른 모듈'에 대해 잊어 버려. 실제 클래스 정의를 벗어난 주된 이유는 모두 들여 쓰기 할 필요가 없었기 때문입니다 (약 80 개). 나는 그것이 "청소기"라고 생각했다. 그렇지 않으면 80 함수를 가진 클래스를 만드는 것보다 모듈 내부에 함수가있는 것이 더 깨끗해 보입니다. –

-3

적합하지 않은지 확실하지 않지만 MyClass에서 파생하고 원하는 기능을 추가하십시오.

1

예 당신은 확실히 할 수 있습니다 인쇄됩니다 당신은 하나 개의 클래스 Helper는 전문 클래스 (MyClass)

class Helper(object): 

    def add(self, a, b): 
     return a + b 

    def mul(self, a, b): 
     return a * b 


class MyClass(Helper): 

    def __init__(self): 
     Helper.__init__(self) 
     print self.add(1, 1) 


if __name__ == '__main__': 
    obj = MyClass() 

에 기능을 제공하는 경우, 무엇을 찾고에서 촬영을 제공 클래스 외부의 함수. 여기에 미니 예제가 있습니다 ...

def date_parse(date_string): 
    return date(date_string) 


class MyClass: 
    def myFunc(self): 
     pass 

    def myDateFunc(self, date_string): 
     self.date = date_parse(date_string) 
+0

아니요, 클래스 밖에서 클래스의 메서드를 정의 할 수 있습니까? –

3

도움이 될지 확실하지 않지만 조금 더 분명하게 알려줍니다. 이 이제까지 좋습니다 경우 잘 모르겠습니다 만에 이런 식으로 일을 할 ... MyClass1에서 무슨 일이 일어나고 있는지에

class MyClass1(object): 
    def __init__(self, bar): 
     self.foo = 'updog' 
     MyClass1.foobar = bar 

class MyClass2(object): 
    def __init__(self, bar): 
     self.foo = 'updog' 
     self.foobar = bar 

def bar(self): 
    return "What's " + self.foo 

것을 우선 보자. 이 클래스의 foobar은 클래스 정의 내부에 정의 된 것처럼 일반적인 메소드와 유사합니다 (즉,이 클래스의 인스턴스에 바인딩 된 메소드). 어떻게 이런 일이 MyClass2에서

In [2]: x = MyClass1(bar) 

In [3]: x.foobar 
Out[3]: <bound method MyClass1.bar of <__main__.MyClass1 object at 0x104346990>> 

In [4]: x.foobar() 
Out[4]: "What's updog" 

다릅니 까 ...의이 같은 모습을 살펴 보자? MyClass2에서 foobar은 단순히 바 기능에 대한 참조이며 바운드 방식이 아닙니다. 이 때문에이 함수가 제대로 작동하려면 인스턴스를 전달해야합니다. 예 :

In [5]: y = MyClass2(bar) 

In [6]: y.foobar 
Out[6]: <function __main__.bar> 

In [7]: y.foobar() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-7-6feb04878e5f> in <module>() 
----> 1 y.foobar() 

TypeError: bar() takes exactly 1 argument (0 given) 

In [8]: y.foobar(y) 
Out[8]: "What's updog" 

희망 그 진흙 등이 명확하게 ...

관련 문제