2012-04-25 39 views
13

Trong Python, biến lớp có thể được truy cập thông qua đó lớp Ví dụ:Python: biến truy cập lớp qua dụ

>>> class A(object): 
...  x = 4 
... 
>>> a = A() 
>>> a.x 
4 

Thật dễ dàng để chứng minh rằng a.x đang thực sự quyết tâm A.x, không sao chép vào một thể hiện trong quá trình thi:

>>> A.x = 5 
>>> a.x 
5 

Mặc dù hành vi này là well known và được sử dụng rộng rãi, tôi không thể tìm thấy bất kỳ tài liệu dứt khoát nào bao gồm nó. Gần nhất tôi có thể tìm thấy trong tài liệu Python là section on classes:

class MyClass: 
    """A simple example class""" 
    i = 12345 
    def f(self): 
     return 'hello world' 

[snip]

... Theo định nghĩa, tất cả các thuộc tính của một lớp học mà là đối tượng chức năng xác định phương pháp tương ứng của trường mình. Vì vậy, trong ví dụ của chúng tôi, x.f là một tham chiếu phương thức hợp lệ, vì MyClass.f là một hàm, nhưng x.i thì không, vì MyClass.i thì không. ...

Tuy nhiên, phần này nói cụ thể về các phương pháp để nó có thể không liên quan đến trường hợp chung.

Câu hỏi của tôi là, tài liệu này có được không? Tôi có thể dựa vào hành vi này không?

Trả lời

13

Refs các ClassesClass instances bộ phận trong http://docs.python.org/reference/datamodel.html

Một lớp học có một không gian tên được thực hiện bởi một đối tượng từ điển. Class tham chiếu thuộc tính được dịch sang tra cứu trong từ điển này, ví dụ, Cx được dịch sang C .__ dict __ ["x"] (mặc dù các lớp kiểu mới đặc biệt có một số móc cho phép các phương tiện định vị thuộc tính khác)

Một cá thể lớp được tạo bằng cách gọi một đối tượng lớp (xem ở trên). Một cá thể lớp có vùng tên được triển khai dưới dạng từ điển là nơi đầu tiên trong đó tham chiếu thuộc tính được tìm kiếm. Khi không tìm thấy thuộc tính ở đó và lớp của cá thể có thuộc tính theo tên đó, tìm kiếm sẽ tiếp tục với thuộc tính lớp .

Nói chung, việc sử dụng này là tốt, ngoại trừ trường hợp đặc biệt được đề cập là "lớp kiểu mới nói riêng có một số móc cho phép các phương tiện định vị thuộc tính khác".

7

Không chỉ bạn có thể dựa vào hành vi này, bạn thường xuyên làm.

Suy nghĩ về phương pháp. Một phương thức chỉ đơn thuần là một hàm đã được tạo thành một thuộc tính lớp. Sau đó bạn tìm kiếm nó trên ví dụ.

>>> def foo(self, x): 
...  print "foo:", self, x 
... 
>>> class C(object): 
...  method = foo # What a weird way to write this! But perhaps illustrative? 
... 
>>> C().method("hello") 
foo: <__main__.C object at 0xadad50> hello 

Trong trường hợp đối tượng như chức năng, đây không phải là tra cứu đơn giản, nhưng một số phép thuật tự động vượt qua self. Bạn có thể đã sử dụng các đối tượng khác có nghĩa là để được lưu trữ như là các thuộc tính lớp và tra cứu trên cá thể; các thuộc tính là một ví dụ (hãy xem nội dung xây dựng property nếu bạn không quen thuộc với nó.)

Như ghi chú okm, cách thức hoạt động này được mô tả trong data model reference (bao gồm thông tin và liên kết để biết thêm thông tin về ma thuật làm cho phương pháp và thuộc tính hoạt động). Trang Mô hình Dữ liệu là một phần hữu ích nhất của Tham chiếu Ngôn ngữ; nó cũng bao gồm một số tài liệu khác về hầu hết các phương thức và tên của __foo__.

+0

+1 để xem phương pháp mới, nhưng hầu hết mã tôi đã viết trong quá khứ, giờ trông có vẻ lạ hơn và dễ vỡ hơn đối với tôi; Cảm ơn vì điều đó :-/ – 0xc0de

Các vấn đề liên quan