Làm thế nào để bạn sử dụng hàm tạo của lớp cha trong python?

Kế thừa và đa hình – đây là một khái niệm rất quan trọng trong Python. Bạn phải hiểu nó hơn nếu bạn muốn học

Một trong những ưu điểm chính của Lập trình hướng đối tượng là tái sử dụng. Kế thừa là một trong những cơ chế để đạt được cùng. Tính kế thừa cho phép lập trình viên tạo một lớp chung hoặc lớp cơ sở trước và sau đó mở rộng nó sang lớp chuyên biệt hơn. Nó cho phép lập trình viên viết mã tốt hơn

Sử dụng tính kế thừa, bạn có thể sử dụng hoặc kế thừa tất cả các trường dữ liệu và phương thức có sẵn trong lớp cơ sở của mình. Sau đó, bạn có thể thêm các phương thức và trường dữ liệu của riêng mình, do đó, tính kế thừa cung cấp một cách để tổ chức mã, thay vì viết lại từ đầu

Trong thuật ngữ hướng đối tượng khi lớp X mở rộng lớp Y, thì Y được gọi là lớp siêu/lớp cha/lớp cơ sở và X được gọi là lớp con/lớp con/lớp dẫn xuất. Một điểm cần lưu ý ở đây là chỉ các trường dữ liệu và phương thức không riêng tư mới được truy cập bởi các lớp con. Các trường và phương thức dữ liệu riêng tư chỉ có thể truy cập được bên trong lớp

cú pháp để tạo một lớp dẫn xuất là -

class BaseClass:
   Body of base class
class DerivedClass[BaseClass]:
   Body of derived class

Kế thừa thuộc tính

Bây giờ hãy xem ví dụ dưới đây -

đầu ra

Trước tiên, chúng tôi tạo một lớp có tên là Ngày và chuyển đối tượng làm đối số, đối tượng ở đây là lớp tích hợp do Python cung cấp. Sau đó, chúng tôi đã tạo một lớp khác có tên là thời gian và gọi lớp Ngày làm đối số. Thông qua cuộc gọi này, chúng tôi có quyền truy cập vào tất cả dữ liệu và thuộc tính của lớp Ngày vào lớp Thời gian. Do đó, khi chúng ta cố gắng lấy phương thức get_date từ đối tượng lớp Thời gian tm mà chúng ta đã tạo trước đó có thể

Sự vật. Phân cấp tra cứu thuộc tính

  • ví dụ
  • Lớp
  • Bất kỳ lớp nào mà lớp này kế thừa

Kế thừa ví dụ

Hãy cùng xem xét ví dụ về kế thừa -

Hãy tạo một vài lớp để tham gia vào các ví dụ -

  • Animal – Lớp mô phỏng một con vật
  • Mèo − Phân lớp động vật
  • Chó - Lớp con của Động vật

Trong Python, hàm tạo của lớp dùng để tạo một đối tượng [thể hiện] và gán giá trị cho các thuộc tính

Hàm tạo của lớp con luôn được gọi đến hàm tạo của lớp cha để khởi tạo giá trị cho các thuộc tính trong lớp cha, sau đó nó bắt đầu gán giá trị cho các thuộc tính của nó

đầu ra

Trong ví dụ trên, chúng ta thấy các thuộc tính lệnh hoặc phương thức chúng ta đặt trong lớp cha để tất cả các lớp con hoặc lớp con sẽ kế thừa thuộc tính đó từ lớp cha

Nếu một lớp con cố gắng kế thừa các phương thức hoặc dữ liệu từ một lớp con khác thì nó sẽ báo lỗi như chúng ta thấy khi lớp Dog cố gọi các phương thức swatstring[] từ lớp mèo đó, nó sẽ báo lỗi [như AttributeError trong trường hợp của chúng ta]

Đa hình [“NHIỀU HÌNH”]

Đa hình là một tính năng quan trọng của định nghĩa lớp trong Python, được sử dụng khi bạn có các phương thức được đặt tên phổ biến trên các lớp hoặc lớp con. Điều này cho phép các chức năng sử dụng các thực thể thuộc các loại khác nhau tại các thời điểm khác nhau. Vì vậy, nó cung cấp tính linh hoạt và khớp nối lỏng lẻo để mã có thể được mở rộng và dễ dàng duy trì theo thời gian

Điều này cho phép các hàm sử dụng các đối tượng của bất kỳ lớp đa hình nào mà không cần phải nhận thức được sự khác biệt giữa các lớp

Tính đa hình có thể được thực hiện thông qua kế thừa, với các lớp con sử dụng các phương thức của lớp cơ sở hoặc ghi đè chúng

Hãy hiểu khái niệm về tính đa hình với ví dụ kế thừa trước đây của chúng ta và thêm một phương thức chung gọi là show_affiction trong cả hai lớp con -

Từ ví dụ chúng ta có thể thấy, nó đề cập đến một thiết kế trong đó đối tượng có kiểu không giống nhau có thể được xử lý theo cùng một cách hoặc cụ thể hơn là hai hoặc nhiều lớp có phương thức cùng tên hoặc giao diện chung vì cùng một phương thức [ví dụ show_affection bên dưới]

đầu ra

Do, tất cả các loài động vật thể hiện tình cảm [thể hiện tình cảm], nhưng chúng làm khác nhau. Do đó, các hành vi “thể hiện tình cảm” có tính đa hình theo nghĩa là nó hoạt động khác nhau tùy thuộc vào động vật. Vì vậy, khái niệm “động vật” trừu tượng không thực sự “thể hiện_tình cảm”, nhưng các động vật cụ thể [như chó và mèo] có một triển khai cụ thể của hành động “thể hiện tình cảm”

Bản thân Python có các lớp đa hình. Ví dụ, hàm len[] có thể được sử dụng với nhiều đối tượng và tất cả đều trả về kết quả đầu ra chính xác dựa trên tham số đầu vào

ghi đè

Trong Python, khi một lớp con chứa một phương thức ghi đè lên một phương thức của lớp cha, bạn cũng có thể gọi phương thức của lớp cha bằng cách gọi

Super[Lớp con, bản thân]. phương pháp thay vì tự. phương pháp

Thí dụ

class Thought[object]:
   def __init__[self]:
      pass
   def message[self]:
      print["Thought, always come and go"]

class Advice[Thought]:
   def __init__[self]:
      super[Advice, self].__init__[]
   def message[self]:
      print['Warning: Risk is always involved when you are dealing with market!']

Kế thừa Constructor

Nếu chúng ta thấy từ ví dụ kế thừa trước đây của mình, __init__ được đặt trong lớp cha ở phía trên 'vì lớp con dog hoặc cat không có phương thức __init__ trong đó. Python đã sử dụng tra cứu thuộc tính kế thừa để tìm __init__ trong lớp động vật. Khi ta tạo class con, đầu tiên nó sẽ tìm phương thức __init__ trong class dog, sau đó nó không tìm thấy nó tìm trong class cha Animal và tìm thấy ở đó và gọi nó ở đó. Vì vậy, khi thiết kế lớp của chúng ta trở nên phức tạp, chúng ta có thể muốn khởi tạo một cá thể trước tiên xử lý nó thông qua hàm tạo của lớp cha và sau đó thông qua hàm tạo của lớp con

đầu ra

Trong ví dụ trên - tất cả các loài động vật đều có tên và tất cả các con chó thuộc một giống cụ thể. Chúng tôi đã gọi hàm tạo của lớp cha với super. Vì vậy, con chó có __init__ của riêng nó nhưng điều đầu tiên xảy ra là chúng tôi gọi super. Super được xây dựng trong chức năng và nó được thiết kế để liên kết một lớp với lớp cha của nó hoặc lớp cha của nó

Trong trường hợp này, chúng tôi nói rằng hãy lấy siêu lớp dog và chuyển đối tượng dog sang bất kỳ phương thức nào mà chúng tôi nói ở đây là hàm tạo __init__. Vì vậy, nói cách khác, chúng ta đang gọi lớp cha là Animal __init__ với đối tượng dog. Bạn có thể hỏi tại sao chúng ta không chỉ nói Animal __init__ với trường hợp dog, chúng ta có thể làm điều này nhưng nếu tên của lớp động vật thay đổi, đôi khi trong tương lai. Điều gì sẽ xảy ra nếu chúng ta muốn sắp xếp lại hệ thống phân cấp của lớp, để con chó kế thừa từ lớp khác. Sử dụng super trong trường hợp này cho phép chúng tôi giữ mọi thứ theo mô-đun và dễ thay đổi cũng như bảo trì

Vì vậy, trong ví dụ này, chúng tôi có thể kết hợp chức năng __init__ chung với chức năng cụ thể hơn. Điều này cho chúng tôi cơ hội để tách chức năng chung khỏi chức năng cụ thể, có thể loại bỏ sự trùng lặp mã và liên kết các lớp với nhau theo cách phản ánh thiết kế tổng thể của hệ thống

Sự kết luận

  • __init__ giống như bất kỳ phương thức nào khác;

  • Nếu một lớp không có hàm tạo __init__, Python sẽ kiểm tra lớp cha của nó để xem liệu nó có thể tìm thấy không

  • Ngay khi tìm thấy, Python gọi nó và ngừng tìm kiếm

  • Chúng ta có thể sử dụng hàm super[] để gọi các phương thức trong lớp cha

  • Chúng tôi có thể muốn khởi tạo trong lớp cha cũng như lớp riêng của chúng tôi

Đa kế thừa và cây tra cứu

Đúng như tên gọi của nó, đa kế thừa Python là khi một lớp kế thừa từ nhiều lớp

Ví dụ, một đứa trẻ thừa hưởng những đặc điểm tính cách từ cả cha và mẹ [Mẹ và Cha]

Cú pháp đa kế thừa Python

Để tạo một lớp kế thừa từ nhiều lớp cha, chúng ta viết tên của các lớp này bên trong dấu ngoặc đơn cho lớp dẫn xuất khi định nghĩa nó. Chúng tôi phân tách các tên này bằng dấu phẩy

Dưới đây là một ví dụ về điều đó -

>>> class Mother:
   pass

>>> class Father:
   pass

>>> class Child[Mother, Father]:
   pass

>>> issubclass[Child, Mother] and issubclass[Child, Father]
True

Đa kế thừa đề cập đến khả năng kế thừa từ hai hoặc nhiều hơn hai lớp. Sự phức tạp phát sinh khi con kế thừa từ cha mẹ và cha mẹ kế thừa từ lớp ông bà. Python trèo lên cây kế thừa để tìm các thuộc tính đang được yêu cầu đọc từ một đối tượng. Nó sẽ kiểm tra trong thể hiện, trong lớp rồi đến lớp cha và cuối cùng là từ lớp ông bà. Bây giờ câu hỏi đặt ra là các lớp sẽ được tìm kiếm theo thứ tự nào - hơi thở trước hay chiều sâu trước. Theo mặc định, Python ưu tiên độ sâu

Đó là lý do tại sao trong sơ đồ bên dưới, Python tìm kiếm phương thức dothis[] đầu tiên trong lớp A. Vì vậy, thứ tự giải quyết phương pháp trong ví dụ dưới đây sẽ là

Mro-D→B→A→C

Nhìn vào sơ đồ đa thừa kế dưới đây -

Hãy xem qua một ví dụ để hiểu tính năng “mro” của Python

đầu ra

ví dụ 3

Hãy lấy một ví dụ khác về đa thừa kế “hình kim cương”

Sơ đồ trên sẽ được coi là mơ hồ. Từ ví dụ trước của chúng tôi hiểu "thứ tự giải quyết phương pháp". i. e. mro sẽ là D→B→A→C→A nhưng không phải. Khi nhận được A thứ hai từ C, Python sẽ bỏ qua A trước đó. vì vậy mro sẽ ở trong trường hợp này sẽ là D→B→C→A

Hãy tạo một ví dụ dựa trên sơ đồ trên -

đầu ra

Quy tắc đơn giản để hiểu đầu ra ở trên là- nếu cùng một lớp xuất hiện theo thứ tự phân giải phương thức, thì các lần xuất hiện trước đó của lớp này sẽ bị xóa khỏi thứ tự phân giải phương thức

Tóm lại -

  • Bất kỳ lớp nào cũng có thể kế thừa từ nhiều lớp

  • Python thường sử dụng thứ tự "độ sâu đầu tiên" khi tìm kiếm các lớp kế thừa

  • Nhưng khi hai lớp kế thừa từ cùng một lớp, Python sẽ loại bỏ sự xuất hiện đầu tiên của lớp đó khỏi mro

Trang trí, phương thức tĩnh và lớp

Các hàm [hoặc phương thức] được tạo bởi câu lệnh def

Mặc dù các phương thức hoạt động giống hệt như một hàm ngoại trừ một điểm trong đó đối số đầu tiên của phương thức là đối tượng thể hiện

Chúng ta có thể phân loại các phương thức dựa trên cách chúng hoạt động, như

  • Phương thức đơn giản - được định nghĩa bên ngoài một lớp. Hàm này có thể truy cập các thuộc tính của lớp bằng cách cung cấp đối số thể hiện

def outside_func[[]:
def func[self,]
  • Phương thức lớp - nếu chúng ta cần sử dụng các thuộc tính lớp

   @classmethod
def cfunc[cls,]
  • Phương thức tĩnh - không có bất kỳ thông tin nào về lớp

      @staticmethod
def sfoo[]

Cho đến bây giờ chúng ta đã thấy phương thức cá thể, bây giờ là lúc để hiểu sâu hơn về hai phương thức còn lại,

phương pháp lớp

Trình trang trí @classmethod, là một trình trang trí hàm dựng sẵn được chuyển qua lớp mà nó được gọi hoặc lớp của thể hiện mà nó được gọi làm đối số đầu tiên. Kết quả của đánh giá đó làm lu mờ định nghĩa chức năng của bạn

cú pháp

class C[object]:
   @classmethod
   def fun[cls, arg1, arg2, ...]:
      ....
fun: function that needs to be converted into a class method
returns: a class method for function

Họ có quyền truy cập vào đối số cls này, nó không thể sửa đổi trạng thái đối tượng. Điều đó sẽ yêu cầu quyền truy cập vào bản thân

  • Nó được liên kết với lớp và không phải là đối tượng của lớp

  • Các phương thức lớp vẫn có thể sửa đổi trạng thái lớp áp dụng trên tất cả các phiên bản của lớp

Phương thức tĩnh

Một phương thức tĩnh không nhận tham số self hay cls[class] nhưng nó có thể tự do chấp nhận một số tham số khác tùy ý

cú pháp

________số 8
  • Một phương thức tĩnh không thể sửa đổi trạng thái đối tượng cũng như trạng thái lớp
  • Họ bị hạn chế về dữ liệu họ có thể truy cập

Khi nào thì dùng cái gì

  • Chúng tôi thường sử dụng phương thức lớp để tạo các phương thức xuất xưởng. Các phương thức xuất xưởng trả về đối tượng lớp [tương tự như hàm tạo] cho các trường hợp sử dụng khác nhau

    Hàm tạo cha mẹ Python là gì?

    Trong Python, hàm tạo của lớp dùng để tạo một đối tượng [thể hiện] và gán giá trị cho các thuộc tính . Hàm tạo của lớp con luôn được gọi đến hàm tạo của lớp cha để khởi tạo giá trị cho các thuộc tính trong lớp cha, sau đó nó bắt đầu gán giá trị cho các thuộc tính của nó.

    Phương thức nào được sử dụng để gọi hàm tạo của lớp cha Python?

    Trong Python, phương thức __init__[] được gọi là hàm tạo và luôn được gọi khi một đối tượng được tạo.

    Làm cách nào chúng ta có thể thực thi hàm tạo của lớp cha từ lớp con?

    Chúng ta không thể chạy trực tiếp hàm tạo của lớp cha trong lớp con nếu lớp con định nghĩa một hàm tạo. Để chạy hàm tạo cha, hãy gọi hàm cha. Cần có __construct[] bên trong hàm tạo con .

    Phương thức nào sẽ gọi phương thức khởi tạo của lớp cha?

    Để gọi hàm tạo của lớp cha, chúng ta có thể sử dụng từ khóa super . Phương thức super[] từ phương thức khởi tạo được sử dụng để gọi phương thức khởi tạo của lớp cha để có quyền truy cập vào các thuộc tính và phương thức của lớp cha.

Chủ Đề