2009-04-10 5 views
20

lớp PHP có thể sử dụng từ khóa "tự" trong một bối cảnh tĩnh, như thế này:Trong Python, làm thế nào để tôi tham khảo một lớp chung một cách tĩnh, giống như từ khóa "tự" của PHP?

<?php 
class Test { 
    public static $myvar = 'a'; 
    public static function t() { 
    echo self::$myvar; // Generically reference the current class. 
    echo Test::$myvar; // Same thing, but not generic. 
    } 
} 
?> 

Rõ ràng là tôi không thể sử dụng "tự" theo cách này bằng Python vì "tự" là không để một lớp học nhưng cho một ví dụ. Vì vậy, có một cách tôi có thể tham khảo các lớp học hiện tại trong một bối cảnh tĩnh trong Python, tương tự như "tự" của PHP?

Tôi đoán những gì tôi đang cố gắng làm thay vì không phải là pythonic. Không chắc chắn mặc dù, tôi mới đến Python. Đây là mã của tôi (sử dụng khung công tác Django):

class Friendship(models.Model): 
    def addfriend(self, friend): 
    """does some stuff""" 

    @staticmethod # declared "staticmethod", not "classmethod" 
    def user_addfriend(user, friend): # static version of above method 
    userf = Friendship(user=user) # creating instance of the current class 
    userf.addfriend(friend) # calls above method 

# later .... 
Friendship.user_addfriend(u, f) # works 

Mã của tôi hoạt động như mong đợi. Tôi chỉ muốn biết: có một từ khóa tôi có thể sử dụng trên dòng đầu tiên của phương pháp tĩnh thay vì "Tình bạn"?

Bằng cách này nếu tên lớp thay đổi, phương pháp tĩnh sẽ không phải được chỉnh sửa. Vì nó là viết tắt của phương pháp tĩnh sẽ phải được chỉnh sửa nếu tên lớp thay đổi.

+0

khi tôi cố gắng sử dụng tự .__ class__ bên trong một phương pháp tĩnh, tôi nhận được toàn cầu tên 'tự' không được định nghĩa – Eddified

+0

Bạn vẫn đi qua "tự "để phương pháp? Hãy nhớ rằng "tự" là tên thông số, không phải là từ khóa. –

+0

@Được xác định: có thể đã là nhận xét về câu trả lời, không phải là câu hỏi –

Trả lời

22

này nên làm như lừa:

class C(object): 
    my_var = 'a' 

    @classmethod 
    def t(cls): 
     print cls.my_var 

C.t() 
+0

Dễ hiểu, hoàn toàn giống với ví dụ về php. Làm việc cho tôi. Cảm ơn! – Eddified

23

Trong mọi trường hợp, self.__class__ là lớp của đối tượng.

http://docs.python.org/library/stdtypes.html#special-attributes

Trong trường hợp (rất) hiếm hoi mà bạn đang cố gắng để gây rối với phương pháp tĩnh, bạn thực sự cần classmethod cho việc này.

class AllStatic(object): 
    @classmethod 
    def aMethod(cls, arg): 
     # cls is the owning class for this method 

x = AllStatic() 
x.aMethod(3.14) 
+0

Tôi có nên chuyển "tự" sang một hàm tĩnh không? @staticmethod def blah(): ... – Eddified

+0

Không, bạn không. Một phương thức tĩnh nói chung không cần bất kỳ đối số nào. –