2009-02-10 33 views
16

Tôi nghĩ rằng tôi đã bắt đầu để có được một va li về "cách Python" của lập trình. Các phương thức của một lớp tự chấp nhận là tham số đầu tiên để tham chiếu đến cá thể của lớp có ngữ cảnh mà phương thức đang được gọi. Bộ trang trí @classmethod đề cập đến một phương thức có chức năng được liên kết với lớp, nhưng không tham chiếu đến ví dụ cụ thể.Tự 'tham chiếu' trong một @classmethod là gì?

Vì vậy, tham số đầu tiên của @classmethod (chuẩn là 'self') là gì nếu phương thức được gọi là không có tham chiếu đối tượng?

Trả lời

34

class itself:

Một phương pháp lớp nhận lớp như là đối số đầu tiên ngầm, giống như một phương pháp dụ nhận được ví dụ.

class C: 
    @classmethod 
    def f(cls): 
     print(cls.__name__, type(cls)) 

>>> C.f() 
C <class 'type'> 

và nó cls theo giáo luật, btw

+0

+1: Trích các tài liệu –

0

Đối tượng lớp được thông qua như là tham số đầu tiên. Ví dụ:

class Foo(object): 
    @classmethod 
    def bar(self): 
     return self() 

Sẽ trả về phiên bản của lớp Foo.

EDIT:

Lưu ý rằng dòng cuối cùng sẽ tự() vô ngã. tự sẽ trả về chính lớp đó, trong khi self() trả về một cá thể.

+3

Điều này là đúng, nhưng điều quan trọng cần lưu ý là 'cls' thường được sử dụng như tham số đầu tiên cho một lớp học. – Lenna

12

Tham số đầu tiên của một lớp học được đặt tên theo quy ước cls theo quy ước và đề cập đến đối tượng lớp mà phương thức được gọi là.

>>> class A(object): 
...  @classmethod 
...  def m(cls): 
...   print cls is A 
...   print issubclass(cls, A) 

>>> class B(A): pass 
>>> a = A() 
>>> a.m() 
True 
True 
>>> b = B() 
>>> b.m() 
False 
True 
0

Django hiện một số thứ kỳ lạ với một phương pháp học ở đây:

class BaseFormSet(StrAndUnicode): 
    """ 
    A collection of instances of the same Form class. 
    """ 
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, 
       initial=None, error_class=ErrorList): 
     ... 
     self.prefix = prefix or self.get_default_prefix() 
     ... 

Mặc dù get_default_prefix được khai báo theo cách này (trong cùng một lớp):

@classmethod 
    def get_default_prefix(cls): 
     return 'form' 
Các vấn đề liên quan