2013-01-15 25 views
20

Đây là khó chịu:Python: có thể gọi phương thức tĩnh từ bên trong lớp mà không đủ điều kiện tên

class MyClass: 
    @staticmethod 
    def foo(): 
     print "hi" 

    @staticmethod 
    def bar(): 
     MyClass.foo() 

Có cách nào để làm cho công việc này mà không cần đặt tên MyClass trong cuộc gọi? tức là tôi có thể nói foo() ở dòng cuối cùng?

+0

Nope. Bạn đang cố gắng đạt được điều gì? –

+0

Một phương thức lớp lấy lớp là tham số đầu tiên _bởi vì nó sử dụng class_. 'bar' phải là' @ classmethod'. – katrielalex

Trả lời

17

Không có cách nào để sử dụng foo và nhận được những gì bạn muốn. Không có phạm vi lớp tiềm ẩn, do đó, foo là địa phương hoặc toàn cầu, không phải trong số đó bạn muốn.

Bạn có thể thấy classmethods hữu ích hơn:

class MyClass: 
    @classmethod 
    def foo(cls): 
     print "hi" 

    @classmethod 
    def bar(cls): 
     cls.foo() 

Bằng cách này, ít nhất bạn không phải lặp lại tên của lớp.

+8

Tại sao làm 'foo' một' classmethod' khi bạn không sử dụng lớp? Tôi sẽ làm cho 'foo' một' staticmethod' và 'bar' một' classmethod' (như bạn đã làm). – mgilson

1

Không thể. Đó là một câu hỏi về thiết kế ngôn ngữ. So sánh với C++, trong đó cả hai this (giống như Python self; trong Python bạn phải viết self.var, trong C++ bạn có thể viết chỉ var, không this->var) và lớp riêng được sử dụng theo mặc định trong các hàm thành viên. đôi khi điều đó tốt và đôi khi gây phiền toái. Điều duy nhất có thể là làm quen với tính năng đó.

-1

Bạn có thể làm điều gì đó hacky bằng cách làm cho một chức năng cấp module foo và sau đó thêm nó vào không gian tên lớp với staticmethod:

def foo(): 
    print "hi" 

class MyClass(object): 
    foo = staticmethod(foo) 

    @classmethod 
    def bar(cls): 
     return cls.foo() 

    def baz(self): 
     return foo() 


c = MyClass() 
c.bar() 
c.baz() 

MyClass.bar() 
MyClass.foo() 
Các vấn đề liên quan