Mỗi lớp có cần một python phương thức init không?

Công việc của hàm tạo lớp Python là khởi tạo thể hiện của lớp. Python __init__[] là hàm khởi tạo cho các lớp trong Python

Cú pháp hàm __init__[] của Python

Cú pháp hàm __init__[] là

def __init__[self, [arguments]]

  • Từ khóa def được sử dụng để xác định nó vì nó là một chức năng
  • Đối số đầu tiên đề cập đến đối tượng hiện tại. Nó liên kết thể hiện với phương thức init[]. Nó thường được đặt tên là “self” để tuân theo quy ước đặt tên. Bạn có thể đọc thêm về nó tại Python self variable
  • Các đối số của phương thức init[] là tùy chọn. Chúng ta có thể định nghĩa một hàm tạo với bất kỳ số lượng đối số nào

Ví dụ về hàm tạo lớp Python

Hãy xem xét một số ví dụ về hàm tạo trong các tình huống khác nhau

1. Lớp không có hàm tạo

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

class Data:
    pass


d = Data[]
print[type[d]]  # 
7 là cơ sở của tất cả các lớp trong Python

class Data:
    pass


d = Data[]
print[type[d]]  # 

Đây là một ví dụ khác để xác nhận rằng hàm tạo của lớp cha được gọi để khởi tạo thể hiện của lớp con

class BaseData:

    def __init__[self, i]:
        print[f'BaseData Constructor with argument {i}']
        self.id = i


class Data[BaseData]:
    pass


d = Data[10]
print[type[d]]

đầu ra

BaseData Constructor with argument 10

2. Trình xây dựng đơn giản không có đối số

Chúng ta có thể tạo một hàm tạo mà không cần bất kỳ đối số nào. Nó rất hữu ích cho các mục đích ghi nhật ký, chẳng hạn như giữ số lượng các phiên bản của lớp

class Data1:
    count = 0

    def __init__[self]:
        print['Data1 Constructor']
        Data1.count += 1


d1 = Data1[]
d2 = Data1[]
print["Data1 Object Count =", Data1.count]

đầu ra

Data1 Constructor
Data1 Constructor
Data1 Object Count = 2

3. Trình tạo lớp có đối số

Hầu hết thời gian, bạn sẽ tìm thấy hàm tạo với một số đối số. Các đối số này thường được sử dụng để khởi tạo các biến thể hiện

class Data2:

    def __init__[self, i, n]:
        print['Data2 Constructor']
        self.id = i
        self.name = n


d2 = Data2[10, 'Secret']
print[f'Data ID is {d2.id} and Name is {d2.name}']

đầu ra

________số 8

4. Trình tạo lớp có tính kế thừa

class Person:

    def __init__[self, n]:
        print['Person Constructor']
        self.name = n


class Employee[Person]:

    def __init__[self, i, n]:
        print['Employee Constructor']
        super[].__init__[n]  # same as Person.__init__[self, n]
        self.id = i


emp = Employee[99, 'Pankaj']
print[f'Employee ID is {emp.id} and Name is {emp.name}']

đầu ra

class Data:
    pass


d = Data[]
print[type[d]]  # 
0

  • Chúng ta có trách nhiệm gọi hàm tạo của lớp bậc trên
  • Chúng ta có thể sử dụng hàm super[] để gọi hàm tạo của lớp bậc trên
  • Chúng ta cũng có thể sử dụng tên của lớp cha để gọi phương thức init[] của nó

5. Constructor Chaining với kế thừa đa cấp

class Data:
    pass


d = Data[]
print[type[d]]  # 
0

đầu ra

class Data:
    pass


d = Data[]
print[type[d]]  # 
1

6. Constructor với nhiều kế thừa

Chúng ta không thể sử dụng super[] để truy cập tất cả các lớp cha trong trường hợp có nhiều kế thừa. Cách tiếp cận tốt hơn là gọi hàm tạo của các lớp cha bằng tên lớp của chúng

class Data:
    pass


d = Data[]
print[type[d]]  # 
2

đầu ra

class Data:
    pass


d = Data[]
print[type[d]]  # 
3

Python không hỗ trợ nhiều hàm tạo

Python không hỗ trợ nhiều hàm tạo, không giống như các ngôn ngữ lập trình hướng đối tượng phổ biến khác như Java

Chúng tôi có một đối tượng

class Data:
    pass


d = Data[]
print[type[d]]  # 
5 tại thời điểm này, nhưng đối tượng
class Data:
    pass


d = Data[]
print[type[d]]  # 
5 này thực sự không có ý nghĩa gì vì nó không có chức năng [nó không lưu trữ bất kỳ dữ liệu hữu ích nào hoặc có bất kỳ phương thức nào]

Chúng tôi có thể thêm các thuộc tính vào các đối tượng

class Data:
    pass


d = Data[]
print[type[d]]  # 
5 theo cách thủ công để lưu trữ một số dữ liệu về chúng

Nhưng làm như vậy sẽ là một chút ngớ ngẩn

Sẽ tốt hơn nếu bằng cách nào đó chúng ta có thể gọi lớp này với các đối số để tự động lưu trữ các thuộc tính

Phương thức khởi tạo

Hiện tại, nếu chúng ta cố gắng gọi lớp này bằng các đối số, chúng ta sẽ gặp lỗi

class Data:
    pass


d = Data[]
print[type[d]]  # 
5

Để chấp nhận các đối số, chúng ta cần định nghĩa một phương thức

class Data:
    pass


d = Data[]
print[type[d]]  # 
8 trong lớp của chúng ta

class Data:
    pass


d = Data[]
print[type[d]]  # 
6

Đối số đầu tiên trong phương thức

class Data:
    pass


d = Data[]
print[type[d]]  # 
8 của chúng ta sẽ luôn là
class Data:
    pass


d = Data[]
print[type[d]]  # 
73 [giống như hầu hết các phương thức khác]. Sau đó, chúng ta cần khai báo bất kỳ đối số nào mà chúng ta muốn lớp của mình chấp nhận

Điều chính mà bạn sẽ luôn thấy trong phương pháp

class Data:
    pass


d = Data[]
print[type[d]]  # 
8, là gán cho các thuộc tính

Đây là lớp

class Data:
    pass


d = Data[]
print[type[d]]  # 
5 mới của chúng tôi

class Data:
    pass


d = Data[]
print[type[d]]  # 
8

Nếu chúng ta gọi nó như trước đây mà không có bất kỳ đối số nào, chúng ta sẽ thấy lỗi vì lớp này hiện yêu cầu hai đối số,

class Data:
    pass


d = Data[]
print[type[d]]  # 
76 và
class Data:
    pass


d = Data[]
print[type[d]]  # 
77

class Data:
    pass


d = Data[]
print[type[d]]  # 
1

Chúng ta cần cung cấp cho lớp

class Data:
    pass


d = Data[]
print[type[d]]  # 
5 của mình hai đối số để có được một thể hiện mới của lớp này

Đối tượng

class Data:
    pass


d = Data[]
print[type[d]]  # 
5 này hiện có thuộc tính
class Data:
    pass


d = Data[]
print[type[d]]  # 
76 và thuộc tính
class Data:
    pass


d = Data[]
print[type[d]]  # 
77

Điều đó có nghĩa là phương pháp

class Data:
    pass


d = Data[]
print[type[d]]  # 
8 của chúng tôi được gọi là

Python gọi
class Data:
    pass


d = Data[]
print[type[d]]  # 
8 bất cứ khi nào một lớp được gọi

Bất cứ khi nào bạn gọi một lớp, Python sẽ xây dựng một thể hiện mới của lớp đó, sau đó gọi phương thức

class Data:
    pass


d = Data[]
print[type[d]]  # 
8 của lớp đó, chuyển thể hiện mới được tạo làm đối số đầu tiên [
class Data:
    pass


d = Data[]
print[type[d]]  # 
73]

Không giống như nhiều ngôn ngữ lập trình,

class Data:
    pass


d = Data[]
print[type[d]]  # 
8 không được gọi là "phương thức xây dựng"

Phương thức

class Data:
    pass


d = Data[]
print[type[d]]  # 
8 của Python được gọi là phương thức khởi tạo. Phương thức khởi tạo khởi tạo thể hiện lớp mới của chúng ta. Vì vậy, tại thời điểm mà phương thức khởi tạo được gọi là thể hiện của lớp đã được xây dựng

Bản tóm tắt

Khi bạn tạo một lớp mới trong Python, phương thức đầu tiên bạn có thể tạo là phương thức

class Data:
    pass


d = Data[]
print[type[d]]  # 
8. Phương thức
class Data:
    pass


d = Data[]
print[type[d]]  # 
8 cho phép bạn chấp nhận các đối số cho lớp của mình

Quan trọng hơn, phương thức

class Data:
    pass


d = Data[]
print[type[d]]  # 
8 cho phép bạn gán các giá trị ban đầu cho các thuộc tính khác nhau trên các cá thể lớp của bạn

Chúng ta có thể tạo một lớp không có phương thức Init trong Python không?

Mặc dù không bắt buộc , các lớp Python có thể có thứ gì đó tương tự như hàm tạo. phương thức __init__[]. Tuy nhiên, rất hiếm khi thực sự cần triển khai __new[]__ vì Python xây dựng các đối tượng cho chúng ta. Vì vậy, trong hầu hết các trường hợp, chúng ta thường chỉ triển khai phương thức đặc biệt, __init[]__.

Chúng ta có thể có lớp mà không cần init không?

Các lớp và đối tượng trong Java phải được khởi tạo trước khi chúng được sử dụng .

Có phải mọi phương thức trong một lớp đều cần tự?

Trong lập trình hướng đối tượng, bất cứ khi nào chúng ta định nghĩa các phương thức cho một lớp, chúng ta sử dụng self làm tham số đầu tiên trong mỗi trường hợp . Hãy xem định nghĩa của một lớp có tên là Cat. Trong trường hợp này, tất cả các phương thức, kể cả __init__, đều có tham số đầu tiên là self.

Chủ Đề