2015-03-01 14 views

Trả lời

9

Thuộc tính là biến được tra cứu trên một đối tượng khác sử dụng cú pháp dấu chấm: obj.attribute. Cách Python được thiết kế, tra cứu thuộc tính có thể làm nhiều thứ, và sự đa dạng đôi khi có thể dẫn đến lỗi nếu bạn không thực sự hiểu những gì đang xảy ra (đây là tài liệu bạn liên kết cảnh báo).

Vấn đề cơ bản nhất là tra cứu thuộc tính có thể tìm thấy giá trị được lưu trữ trong từ điển thể hiện của đối tượng hoặc có thể tìm thấy thứ gì đó từ lớp của đối tượng (hoặc lớp cơ sở, nếu có thừa kế). Các phương thức là các hàm được lưu trữ trong lớp, nhưng bạn thường sử dụng chúng bằng cách tìm kiếm chúng trên một cá thể (mà "liên kết" phương thức, chèn đối tượng làm arguemnt đầu tiên khi phương thức được gọi).

Trình tự chính xác của những gì được kiểm tra khi phức tạp một chút (tôi mô tả quá trình đầy đủ trong an answer to another question), nhưng ở cấp độ cơ bản nhất, các thuộc tính cá thể thường được ưu tiên hơn thuộc tính lớp.

Nếu một thuộc tính thể hiện và thuộc tính lớp có cùng tên tồn tại, thường chỉ có thuộc tính thể hiện mới có thể truy cập được. Điều này có thể rất khó hiểu nếu nó là vô ý.

Xét đoạn mã sau:

class Foo(object): 
    def __init__(self, lst): 
     self.lst = lst 

    def sum(self): 
     self.sum = sum(self.lst) 
     return self.sum 

f = Foo([1,2,3]) 

print(f.sum()) 
print(f.sum()) 

Ở dưới cùng của mã này, chúng ta thực hiện hai cuộc gọi giống hệt nhau. Việc đầu tiên hoạt động tốt, nhưng thứ hai sẽ tăng một ngoại lệ.

Điều này là do lần đầu tiên chúng tôi tra cứu f.sum chúng tôi tìm thấy phương thức trong lớp Foo. Chúng ta có thể gọi phương thức mà không có vấn đề gì. Sự cố xuất phát từ thực tế là phương pháp sum gán kết quả tính toán của nó (tổng của các phần tử trong self.lst) vào một thuộc tính thể hiện cũng có tên là sum. Điều này ẩn phương thức sum từ chế độ xem.

Khi giây thứ hai f.sum() gọi tra cứu f.sum, nó tìm thuộc tính thể hiện, chứa số nguyên 6, thay vì phương thức dự kiến. Một số nguyên không thể gọi được, vì vậy chúng tôi có ngoại lệ.

Giải pháp, tất nhiên, không được sử dụng cùng tên cho phương pháp và thuộc tính. Đoạn mã trên là một ví dụ khá tầm thường. Các lỗi gây ra bởi loại điều này trong mã phức tạp hơn có thể khó khăn hơn nhiều để tìm ra.

Nếu bạn đang viết mã để thêm thuộc tính vào đối tượng bạn không biết nhiều, bạn nên cẩn thận để tránh các tên thông thường. Nếu bạn đang viết một lớp mixin, hãy xem xét sử dụng hai dấu gạch dưới hàng đầu trong tên thuộc tính để kích hoạt tên mangling của Python, được thiết kế cho chính xác loại tình huống này.

+0

Giải thích của bạn khá đơn giản. Vì vậy, nhìn tôi rằng tài liệu tôi đã liên kết muốn có nghĩa là 'data attribute' = 'instance attribute', 'method attribute' = 'class attribute'. Nếu tôi sai, hãy sửa tôi. –

+0

Vâng, đúng vậy. Tôi nghĩ rằng tài liệu có thể khá cũ và không hoàn toàn cập nhật. Chắc chắn, "thuộc tính dụ" và "thuộc tính lớp" là các thuật ngữ phổ biến hơn trong những ngày này. Nó cũng đáng chú ý rằng tình hình thực tế là một chút phức tạp hơn tôi đã trình bày ở đây. Một số loại thuộc tính lớp (ví dụ: các đối tượng 'thuộc tính') sẽ được ưu tiên hơn các thuộc tính mẫu. Tuy nhiên, bạn sẽ không gặp phải tình huống đó do nhầm lẫn. – Blckknght

3

Thuộc tính là bất cứ điều gì cho việc thiếu một từ tốt hơn đó là ràng buộc để một đối tượng, ví dụ:

class Dog: 
    def __init__(self): 
     self.name = "Rufus" 

    def bark(self): 
     print "Woof Woof!" 

Trong trường hợp này thuộc tính dữ liệu là tên, mà chỉ đơn giản là một giá trị đó là ràng buộc với trường hợp của Chó. Đối với một thuộc tính method, một câu trả lời sẽ là phương thức bark, vì nó không phải là một giá trị quá nhiều vì nó là một hành động. Nó giống như tiếng Anh. Thuộc tính dữ liệu chính xác như âm thanh; đó là dữ liệu, nó chỉ đơn giản là một tài sản. Một phương thức là một thủ tục, một hành động, và đây chính xác là thuộc tính của phương thức.

1

Thuộc tính cơ bản là mọi thứ bạn có thể làm instance.attribute_name với. Ví dụ trong:

class Hello(object): 
    def __init__(self, word): 
     self.word = word 

    def greet(self): 
     print "Hello: "+self.word 

__init__, greetword tất cả sẽ là thuộc tính. Tôi sẽ đoán rằng một phương pháp là bất cứ điều gì được tuyên bố với def tại phạm vi lớp (như trái ngược với làm self.func = lambda x: x * x ví dụ). Trong trường hợp này, bạn sẽ bị ràng buộc với các phương thức không ràng buộc và không bị ràng buộc và tương tự. Phần quan trọng là cho một thuộc tính thành viên khi bạn làm instance.method_name bạn lấy lại một phương thức bị ràng buộc, mà khi bạn gọi nó sẽ gọi phương thức ban đầu với cá thể là đối số đầu tiên.

Ngoài ra, sau khi đọc một số phần đó, từ ngữ của họ hơi khó hiểu/sai. Ví dụ, họ nói "thuộc tính phương pháp ghi đè thuộc tính dữ liệu có cùng tên", mà theo như tôi biết sẽ được tốt hơn đặt như thuộc tính dụ ghi đè thuộc tính lớp có cùng tên. Từ ví dụ tôi đã đưa, nếu chúng ta mở rộng này để:

class Hello(object): 
    greeting = "Hello: " 
    def __init__(self, word): 
     self.word = word 

    def greet(self): 
     print self.greeting+self.word 

Sau đó, chúng ta có thể làm:

>>> a = Hello("world") 
>>> a.greeting = "Goodbye " 
>>> a.greet() 
"Goodbye world" 

này do thực tế rằng chúng ta đặt một thuộc tính thể hiện của lời chào qua thuộc tính lớp chúc mừng. Vì các phương thức được định nghĩa trong lớp (cách thông thường) là các thuộc tính lớp, chúng sẽ bị ghi đè bởi bất kỳ thuộc tính cá thể nào (dữ liệu hoặc cách khác).

0

Đây là giải thích thẳng về phía trước cho câu hỏi của bạn, điều này đã giúp tôi hiểu sự khác biệt giữa thuộc tính và phương thức.

Lớp học giống như một tập hợp các hướng dẫn hoặc kế hoạch chi tiết về cách xây dựng nhiều đối tượng có chung đặc điểm.

Đối tượng là loại dữ liệu được tạo theo thông số kỹ thuật do định nghĩa lớp cung cấp.

Thuộc tính là giá trị (đặc trưng). Hãy suy nghĩ về một thuộc tính như một biến được lưu trữ trong một đối tượng.

Phương thức là tập hợp các hướng dẫn. Các phương thức là các hàm, được liên kết với một đối tượng. Bất kỳ hàm nào được bao gồm trong định nghĩa lớp cha đều có thể được gọi bởi một đối tượng của lớp đó.

Tôi hy vọng điều này sẽ hữu ích.

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