2010-05-14 59 views
55

Tôi mới sử dụng Python ... và xuất phát từ một nền Java chủ yếu, nếu có bất kỳ điều gì.Tính đa hình hoạt động như thế nào trong Python?

Tôi đang cố gắng hiểu tính đa hình trong Python. Có lẽ vấn đề là tôi đang mong đợi các khái niệm mà tôi đã biết để đưa vào Python. Nhưng tôi cùng nhau đưa các mã kiểm tra sau:

class animal(object): 
    "empty animal class" 

class dog(animal): 
    "empty dog class" 

myDog = dog() 
print myDog.__class__ is animal 
print myDog.__class__ is dog 

Từ polymorphism Tôi đang sử dụng để (ví dụ java của instanceof), tôi mong chờ cả các báo cáo để in đúng, như một thể hiện của con chó là một động vật và cũng là là một con chó. Nhưng đầu ra của tôi là:

False 
True 

Tôi đang thiếu gì?

+14

Lưu ý rằng việc kiểm tra loại đối tượng là đối diện với đa hình. Đa hình đang hoạt động trên một đối tượng bất kể loại của nó. –

Trả lời

71

Toán tử is trong Python kiểm tra rằng hai đối số tham chiếu đến cùng một đối tượng trong bộ nhớ; nó không giống như toán tử is trong C#.

From the docs:

Các nhà khai thác được và không được kiểm tra nhận dạng đối tượng: x là y là đúng nếu và chỉ nếu x và y là cùng một đối tượng. x không phải là y mang lại giá trị chân lý nghịch đảo.

Điều bạn đang tìm kiếm trong trường hợp này là isinstance.

Trả về true nếu đối số đối tượng là một thể hiện của đối số classinfo hoặc của phân lớp (trực tiếp hoặc gián tiếp).

>>> class animal(object): pass 

>>> class dog(animal): pass 

>>> myDog = dog() 
>>> isinstance(myDog, dog) 
True 
>>> isinstance(myDog, animal) 
True 

Tuy nhiên, thành ngữ Python mệnh lệnh mà bạn (hầu như) không bao giờ làm loại kiểm tra, nhưng thay vì dựa vào duck-typing cho hành vi đa hình. Không có gì sai khi sử dụng isinstance để hiểu được thừa kế, nhưng thông thường nó nên tránh trong mã "sản xuất".

+2

Đối với các lớp kế thừa từ 'đối tượng', bạn cũng có thể nhìn vào' classname .__ mro__' tuple, nhưng thực sự, nó hữu ích hơn cho các mục đích giáo dục. – detly

+0

Cảm ơn! Và yup, tôi chỉ làm điều này như là một phần của quá trình học tập ... hiếm khi sử dụng instanceof trong Java hoặc – froadie

11

Hãy thử isinstance(myDog, dog) resp. isinstance(myDog, animal).

40

phimuemue và Mark đã trả lời câu hỏi của bạn. Nhưng đây cũng là một ví dụ về tính đa hình trong Python, nhưng nó không rõ ràng như ví dụ dựa trên kế thừa của bạn.

class wolf(object): 
    def bark(self): 
     print "hooooowll" 

class dog(object): 
    def bark(self): 
     print "woof" 


def barkforme(dogtype): 
    dogtype.bark() 


my_dog = dog() 
my_wolf = wolf() 
barkforme(my_dog) 
barkforme(my_wolf) 
+21

Nếu không được gọi là duck nhập bằng con chó. – Santa

+1

* dog-typing -: P – stackoverflowuser95

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