Đa hình trong python

Xin chào.
Mình có chút thắc mắc về đa hình trong python. Mình có xem 1 ví dụ ở đây

https://o7planning.org/vi/11417/thua-ke-va-da-hinh-trong-python#a7659095

class English:
    
    def greeting(self):       
        print ("Hello")
        
        
class French:
    
    def greeting(self):
        print ("Bonjour")
  
  
def intro(language):               
    
    language.greeting()
    
    
flora  = English()
aalase = French()   
 
 
intro(flora)
intro(aalase)

Ở trên flora và aalase được truyền vào hàm intro và thực thi hàm greeting của riêng mình, có liên quan gì nhau đâu nhỉ. Vì kiểu của nó đã tường minh rồi

flora  = English()
aalase = French()   

Mình chưa thấy đa hình đâu cả
Trong c++ thì ví dụ thấy rất rõ

   Hinh *hinh; // lớp cha
   HinhChuNhat hcn(13,6); // lớp con
   TamGiac  tag(8, 9); // lớp con

   // luu giu dia chi cua HinhChuNhat
   hinh = &hcn;
   // goi dien tich cua hinh chu nhat. -> gọi hàm của lớp cha
   hinh->dientich();

   // luu giu dia chi cua TamGiac
   hinh = &tag;
   // goi dien tich cua tam giac.  -> gọi hàm của lớp cha
   hinh->dientich();

Xin cảm ơn

Đây là ví dụ của duck typing (gọi được ta cứ gọi), còn superclass to nhất Object chắc là không có greeting() vậy không phải là đa hình.

2 Likes

Hi HelloWorld.
Hãy nhìn nó dưới góc nhình của hàm intro. Nó không biết truyền vào là Eng hay Fr nó chỉ biết đó là ngôn ngữ và là ngôn ngữ thì có thể gọi các hàm nào.

1 Like

Trước mình có hỏi ké 1 câu ở đây

Vậy hàm intro có thể biết được kiểu của đối tượng language đưa vào chứ

Bạn có thể nói rõ hơn được không/

Hi HelloWorld.
Nếu bạn đã hiểu trong C++ thì có thể xem hàm:

// Ham.
void DienTich(Hinh* hinh) {
    hinh->dientich();
}

// Sử dụng.
HinhChuNhat hcn(13,6); // lớp con
TamGiac  tag(8, 9); // lớp con
DienTich(&hcn);
DienTich(&tag);

Không khác gì với ví dụ python của bạn.

1 Like

Trong C++ thì mình hiểu, nhưng trong python mình chưa thấy rõ lắm :3
Mấy cái toán tử lấy địa chỉ và con trỏ trong c++ thấy rõ hơn. Vậy như ví dụ này thì bạn giải thích ntn

Xem sơ sơ introspection :slight_smile: https://docs.python.org/3/library/inspect.html

Do duck typing (bao gồm late binding, https://haacked.com/archive/2014/01/04/duck-typing/ ) nên lưu rất nhiều.

2 Likes

Hi, very interesting!

Mình nghĩ bạn hiểu về polymorphism nói chung, nhưng chưa thực sự cặn kẽ.

Để hiểu tại sao đoạn code trên nói về polymorphism thì cần hiểu định nghĩa của nó là gì. Theo wikipedia:

In programming languages and type theory, polymorphism is the provision of a single interface to entities of different types or the use of a single symbol to represent multiple different types.

Polymorphism là về 2 điểm: interface và types (data types). chính xác hơn polymorphism đặc tính của ngôn ngữ lập trình để một interface làm việc với các data types khác nhau. Giống như cái tên của nó: Poly (many): nhiều, morph(ism): ability to change in form: tính thay đổi nhiều dạng khác nhau. [stackoverflow]

Như vậy thì vẫn hơi abstract quá. Một ví dụ để hiểu về polymorphism trong Python là toán tử cộng.

a = 5
b = 3.5
c = a + b

Dĩ nhiên, đây chỉ là một concrete example để hiểu về polymorphism không phải là cách Python interpreter hoạt động.

Ở 3 dòng trên, biến (object) a là int, b là float. Vậy làm thế nào để một int làm phép cộng với 1 float? Hay nói 1 cách tổng quan hơn, làm thế nào để 1 object làm phép toán cộng với 1 object khác mà datatype nó khác nhau? Đó là nhờ object (a, b) có interface để xử lý ADD operator. Hãy xem ví dụ dưới đây:

Out[25]: a = 5
dir(a)
Out[26]: 
['__abs__',
 '__add__',
 '__and__',
 '__bool__',
 '__ceil__',
 '__class__',
...

Object type (int) có interface như Output[26], trong đó có 1 magic method xử lý phép toán cộng là __add__, nghĩa là với những phép cộng thì method __add__ sẽ được gọi. Thử 1 ví dụ brainfuck sau đây:

In [1]: class five(int):
   ...:     def __init__(self):
   ...:         self.value = 5
   ...:         
   ...:     def __repr__(self):
   ...:         return self.value.__str__()
   ...:     
   ...:     def __add__(self, input_value):
   ...:         return self.value + 10 * input_value
   ...:     

In [2]: a = five()

In [3]: a
Out[3]: 5

In [4]: a + 1
Out[4]: 15

Giờ thắc mắc của bạn được trả lời rồi chứ?

3 Likes

Hi HelloWorld.

  1. Việc con trỏ hay không chỉ là đặc tả ngôn ngữ thôi bạn đừng quan trong nó.
  2. Khi bạn đã ép kiểu rồi thì nó đâu còn đa hình nữa.
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?