Có cần thiết phải xác định init trong python không?

Có hai phương thức tham gia trong quá trình khởi tạo lớp, đó là; .
“new” là một phương thức tĩnh và nó được gọi đầu tiên với đối số đầu tiên là lớp mà một thể hiện mới sẽ được tạo. Sau khi một thể hiện được tạo bởi “new”, quy trình gọi “init” với phần còn lại của các đối số được chuyển cho “new” để khởi tạo và trả về một thể hiện đầy đủ.

Tất cả các lớp đều là lớp con của lớp Đối tượng trong Python, và lớp Đối tượng khai báo các phương thức “dunder” có thể bị ghi đè, bởi ảo của X là lớp con mặc định của lớp đối tượng, điều đó có nghĩa là nó đã có một “mặc định” . Các phương pháp "dunder" vẫn phải nằm trong giới hạn của các quy ước mà chúng được sử dụng. Thứ nhất, chức năng “init” không được phép trả về bất cứ thứ gì.
Thứ hai, bạn đã gọi là “siêu(). init” và được chuyển vào *args và **kwargs, gọi phương thức “init” từ lớp Object vì nó là siêu lớp trực tiếp của Y và hàm “init” đó chỉ mong đợi một đối số, đó là giá trị trả về của .
Vì vậy, đây là cách tốt hơn để triển khai Y

class Y:
    @staticmethod
    def __new__ (cls, *args, **kwargs):
        return object.__new__(cls)

    def __init__ (self, *args, **kwargs):
        #do something with the arguments
        print (args, kwargs)

Hàm tạo của một lớp trong Python được định nghĩa bằng phương thức __init__. Python __init__ là một phương thức dành riêng trong Python hoạt động giống như bất kỳ hàm thành viên nào khác của lớp, ngoại trừ các câu lệnh được viết theo định nghĩa của nó được sử dụng để khởi tạo các thành viên dữ liệu của một lớp trong Python, i. e. về cơ bản nó chứa các câu lệnh gán. Phương thức này được gọi tự động tại thời điểm khởi tạo lớp hoặc tạo đối tượng.  

Trong trường hợp kế thừa, lớp con kế thừa phương thức __init__ của lớp cơ sở cùng với các thành viên lớp có thể truy cập khác. Do đó, đối tượng của lớp cơ sở tự động gọi hàm tạo python __init__ của lớp cơ sở tại thời điểm tạo nó vì nó được gọi bởi hàm tạo __init__ của lớp con.  

Phương thức __init__() hoạt động như thế nào?

Phương thức __init__ của python được khai báo trong một lớp và được sử dụng để khởi tạo các thuộc tính của một đối tượng ngay khi đối tượng được hình thành. Trong khi đưa ra định nghĩa cho phương thức __init__(self), một tham số mặc định, có tên là 'self' luôn được truyền trong đối số của nó. Bản thân này đại diện cho đối tượng của chính lớp đó. Giống như trong bất kỳ phương thức nào khác của một lớp, trong trường hợp __init__, 'self' cũng được sử dụng làm biến đối tượng giả để gán giá trị cho các thành viên dữ liệu của một đối tượng.  

Phương thức __init__ thường được gọi là dấu gạch dưới kép init hoặc dấu gạch dưới init vì nó có hai dấu gạch dưới ở mỗi bên tên của nó. Các dấu gạch dưới kép này ở cả hai bên của init ngụ ý rằng phương thức này được gọi và sử dụng nội bộ trong Python mà không bắt buộc phải được gọi rõ ràng bởi đối tượng.  

Phương thức __init__ của python này có thể có hoặc không nhận đối số để khởi tạo đối tượng. Bạn cũng có thể chuyển các đối số mặc định trong tham số của nó. Tuy nhiên, mặc dù không có khái niệm về Quá tải hàm tạo trong Python, người ta vẫn có thể đạt được tính đa hình trong trường hợp hàm tạo trong Python trên cơ sở đối số của nó

cũng đọc. Đặt trong Python – Cách tạo một bộ trong Python?

Bắt đầu bằng Python. Cú pháp và ví dụ

Chúng ta có thể khai báo một phương thức __init__ bên trong một lớp trong Python bằng cú pháp sau

class class_name():
          
          def __init__(self):
                  # Required initialisation for data members

          # Class methods
                 …
                 …

Hãy lấy một ví dụ về một lớp có tên là Giáo viên trong Python và hiểu rõ hơn về hoạt động của phương thức __init__() thông qua nó.  

class Teacher:
    # definition for init method or constructor
    def __init__(self, name, subject):
        self.name = name
        self.subject = subject
     # Random member function
    def show(self):
        print(self.name, " teaches ", self.subject)
 T = Teacher('Preeti Srivastava', "Computer Science")   # init is invoked here
T.show()

Bây giờ, đối với các tình huống mà bạn được yêu cầu đạt được tính đa hình thông qua phương thức __init__(), bạn có thể sử dụng cú pháp sau

class class_name():
          
          def __init__(self, *args):
                   Condition 1 for *args:
                         # Required initialisation for data members
                  Condition 2 for *args:
                        # Required initialisation for data members
                
                    ………
                    ………

          # Class methods
                 …
                 …

Trong trường hợp này, loại đối số được truyền thay cho *args quyết định loại khởi tạo nào phải được tuân theo. Hãy xem ví dụ được đưa ra dưới đây để hiểu rõ hơn về điều này.  

class Teacher:
     def __init__(self, *args): 

         # Naming the teacher when a single string is passed
         if len(args)==1 & isinstance(args[0], str):
             self.name = args[0]
         
         # Naming the teacher as well as the subject    
         elif len(args)==2:
             self.name = args[0]
             self.sub = args[1]
          
         # Storing the strength of the class in case of a single int argument
         elif isinstance(args[0], int):
             self.strength = args[0]
             
t1 = Teacher("Preeti Srivastava")
print('Name of the teacher is ', t1.name)
 
t2 = Teacher("Preeti Srivastava", "Computer Science")
print(t2.name, ' teaches ', t2.sub)
 
t3 = Teacher(32)
print("Strength of the class is ", t3.strength)

Các loại Trình tạo __init__

Chủ yếu có ba loại hàm tạo __init__ trong Python

  1. Hàm tạo __init__ mặc định
  2. Trình xây dựng __init__ được tham số hóa
  3. __init__ Với tham số mặc định

1. Trình tạo __init__ mặc định

Hàm tạo __init__ mặc định trong Python là hàm tạo không chấp nhận bất kỳ tham số nào, ngoại trừ tham số ‘self’. 'Bản thân' là một đối tượng tham chiếu cho lớp đó. Cú pháp để xác định hàm tạo __init__ mặc định như sau

class class_name():
          
          def __init__(self):
                  # Constructor statements

          # other class methods
                 …
                 …

Cú pháp tạo một đối tượng cho một lớp với hàm tạo __init__ mặc định như sau

Object_name = class_name()

Thí dụ

class Default():
    
    #defining default constructor
    def __init__(self):
        self.var1 = 56
        self.var2 = 27
        
    #class function for addition
    def add(self):
        print("Sum is ", self.var1 + self.var2)

obj = Default()     # since default constructor doesn’t take any argument
obj.add()

2. Trình xây dựng __init__ được tham số hóa

Khi chúng ta muốn truyền các đối số trong hàm tạo của một lớp, chúng ta sử dụng phương thức __init__ được tham số hóa. Nó chấp nhận một hoặc nhiều hơn một đối số khác với bản thân. Cú pháp theo sau khi xác định hàm tạo __init__ được tham số hóa đã được đưa ra bên dưới

________số 8

Chúng tôi khai báo một thể hiện cho một lớp với hàm tạo được tham số hóa bằng cú pháp sau

Object_name = class_name(arg1, arg2, arg3,…)

Thí dụ

class class_name():
          
          def __init__(self):
                  # Required initialisation for data members

          # Class methods
                 …
                 …

0

3. Phương thức __init__ với tham số mặc định

Như bạn có thể đã biết, chúng ta có thể truyền các đối số mặc định cho hàm thành viên hoặc hàm tạo, có thể là bất kỳ ngôn ngữ lập trình phổ biến nào. Theo cách tương tự, Python cũng cho phép chúng ta định nghĩa một phương thức __init__ với các tham số mặc định bên trong một lớp. Chúng tôi sử dụng cú pháp sau để truyền đối số mặc định trong phương thức __init__ trong một lớp

class Teacher:
    # definition for init method or constructor
    def __init__(self, name, subject):
        self.name = name
        self.subject = subject
     # Random member function
    def show(self):
        print(self.name, " teaches ", self.subject)
 T = Teacher('Preeti Srivastava', "Computer Science")   # init is invoked here
T.show()
0

Bây giờ, hãy xem qua ví dụ sau để hiểu cách thức hoạt động của phương thức __init__ với các tham số mặc định

class Teacher:
    # definition for init method or constructor
    def __init__(self, name, subject):
        self.name = name
        self.subject = subject
     # Random member function
    def show(self):
        print(self.name, " teaches ", self.subject)
 T = Teacher('Preeti Srivastava', "Computer Science")   # init is invoked here
T.show()
1

Sử dụng Python __init__

Như đã thảo luận trước đó trong blog này và đã thấy từ các ví dụ trước, phương thức __init__ được sử dụng để khởi tạo các thuộc tính của một đối tượng cho một lớp. Chúng tôi cũng đã hiểu làm thế nào có thể đạt được quá tải hàm tạo bằng phương pháp này. Bây giờ, hãy xem phương thức __init__ này hoạt động như thế nào trong trường hợp kế thừa.  

Tính kế thừa cho phép lớp con kế thừa phương thức __init__() của lớp cha cùng với các thành viên dữ liệu khác và các hàm thành viên của lớp đó. Phương thức __init__ của lớp cha hoặc lớp cơ sở được gọi bên trong phương thức __init__ của lớp con hoặc lớp con. Trong trường hợp lớp cha yêu cầu một đối số, giá trị tham số phải được truyền trong phương thức __init__ của lớp con cũng như tại thời điểm tạo đối tượng cho lớp con.  

class Teacher:
    # definition for init method or constructor
    def __init__(self, name, subject):
        self.name = name
        self.subject = subject
     # Random member function
    def show(self):
        print(self.name, " teaches ", self.subject)
 T = Teacher('Preeti Srivastava', "Computer Science")   # init is invoked here
T.show()
2

Từ đầu ra ở trên, chúng ta có thể theo dõi thứ tự mà các hàm tạo __init__ đã được gọi và thực thi. Đối tượng 't' gọi hàm tạo của lớp Giáo viên, hàm này chuyển quyền điều khiển của chương trình cho hàm tạo của lớp Người. Khi __init__ của Person kết thúc quá trình thực thi, điều khiển sẽ quay trở lại phương thức khởi tạo của lớp Teacher và kết thúc quá trình thực thi của nó.  

Sự kết luận

Vì vậy, tóm lại, __init__ là một phương thức dành riêng cho các lớp trong Python về cơ bản hoạt động như các hàm tạo. Nói cách khác, phương thức này trong lớp Python được sử dụng để khởi tạo các thuộc tính của một đối tượng. Nó được gọi tự động tại thời điểm tạo cá thể cho một lớp. Hàm tạo __init__ này được gọi nhiều lần khi các thể hiện được tạo cho một lớp. Chúng ta có thể sử dụng bất kỳ loại nào trong ba loại hàm tạo __init__ – mặc định, được tham số hóa, __init__ với tham số mặc định – tùy theo nhu cầu của mô-đun lập trình của chúng ta. 'Bản thân' là một tham số bắt buộc đối với bất kỳ hàm thành viên nào của một lớp, bao gồm cả phương thức __init__, vì nó là một tham chiếu đến thể hiện của lớp được tạo.  

Mặc dù Python không hỗ trợ nạp chồng hàm tạo, nhưng khái niệm nạp chồng hàm tạo có thể được triển khai bằng cách sử dụng *args được sử dụng để truyền số lượng đối số khác nhau cho các đối tượng khác nhau của một lớp. Hơn nữa, chúng ta có thể sử dụng các câu lệnh if-else để khởi tạo các thuộc tính theo các loại đối số khác nhau trong hàm tạo __init__. Để biết thêm về Lớp và Đối tượng trong Python, bạn có thể xem blog này

Chúng ta cũng đã thấy phương thức __init__ của một lớp hoạt động như thế nào với tính kế thừa. Chúng ta có thể dễ dàng gọi phương thức __init__ của lớp cơ sở bên trong phương thức __init__ của lớp con. Khi một đối tượng cho lớp con được tạo, phương thức __init__ của lớp con được gọi, phương thức này sẽ gọi tiếp phương thức __init__ của lớp cơ sở

__ init __ có cần thiết trong Python không?

__init__ là một trong những phương thức dành riêng trong Python. Trong lập trình hướng đối tượng, nó được gọi là hàm tạo. Phương thức __init__ có thể được gọi khi một đối tượng được tạo từ lớp và cần có quyền truy cập để khởi tạo các thuộc tính của lớp

Tại sao Python cần init?

__init__. py cho phép trình thông dịch Python biết rằng thư mục chứa mã cho mô-đun Python . Một __init__. tệp py có thể để trống. Nếu không có, bạn không thể nhập các mô-đun từ thư mục khác vào dự án của mình.

Chúng ta có thể tạo lớp mà không cần init trong Python không?

Chúng ta có thể tạo một lớp mà không cần bất kỳ định nghĩa hàm tạo nào . Trong trường hợp này, hàm tạo của lớp cha được gọi để khởi tạo thể hiện của lớp. Lớp đối tượng là cơ sở của tất cả các lớp trong Python.

Bạn có thể định nghĩa một lớp mà không cần init không?