Trăn __new__ so với __init__

Hầu hết các ngôn ngữ lập trình hướng đối tượng như Java, C++, C#. vv có khái niệm về hàm tạo, một phương thức đặc biệt tạo và khởi tạo đối tượng khi nó được tạo. Python hơi khác một chút; . Hàm tạo hiếm khi được sử dụng trừ khi bạn đang làm điều gì đó kỳ lạ. Vì vậy, chúng ta sẽ bắt đầu thảo luận về phương thức khởi tạo.  

Giả định trong bài viết này là bạn đã biết cơ bản về lớp và đối tượng trong python.  

Hàm tạo trong python được gọi là

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
8 và
class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
9 là hàm khởi tạo

Trích dẫn tài liệu về python,

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
8 được sử dụng khi bạn cần kiểm soát việc tạo phiên bản mới trong khi
class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
9 được sử dụng khi bạn cần kiểm soát việc khởi tạo phiên bản mới

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
8 là bước đầu tiên của quá trình tạo cá thể. Nó được gọi đầu tiên và chịu trách nhiệm trả về một phiên bản mới của lớp của bạn

Ngược lại,

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
9 không trả lại bất cứ thứ gì; . Nói chung, bạn không cần ghi đè
class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
8 trừ khi bạn đang phân lớp con một loại bất biến như str, int, Unicode hoặc tuple

LƯU Ý.
Không bao giờ đặt tên hàm của riêng bạn bằng dấu gạch dưới kép ở đầu và cuối. Nó có thể không có ý nghĩa gì đối với Python, nhưng luôn có khả năng các nhà thiết kế Python sẽ thêm một chức năng có mục đích đặc biệt với tên đó trong tương lai và khi họ làm như vậy, mã của bạn sẽ bị hỏng.

ví dụ 1. Sử dụng class Person: def __new__(cls): return object.__new__(cls) def __init__(self): self.instance_method() def instance_method(self): print('success!') personObj = Person() 9

class Point:

    def __init__(self, data):
        self.num = data

    def print_num(self):
        print(self.num)



obj = Point(100)

obj.print_num()

đầu ra

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
0

Ghi chú. Tham số self là một tham chiếu đến thể hiện hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp

ví dụ 2

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()

Lưu ý rằng

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
9 nhận đối số self, trong khi
class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
8 nhận lớp
class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
3). Vì
class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
4 là một tham chiếu đến thể hiện, điều này sẽ cho bạn biết khá rõ ràng rằng thể hiện đã được tạo vào thời điểm
class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
9 được gọi, vì nó đã vượt qua thể hiện. Cũng có thể gọi các phương thức thể hiện một cách chính xác vì thể hiện đã được tạo

Ở bài viết này, chúng ta sẽ xem xét các khái niệm cơ bản của LẬP TRÌNH khám phá ĐIỀU TƯỢNG TRONG PYTHON chính là Lớp (lớp) và đối tượng (đối tượng). Trong đối tượng, ta sẽ biết cách tạo, sử dụng các thuộc tính (attribute) và các phương thức (method) của đối tượng đó


Nội dung

Để theo dõi bài viết này một cách tốt nhất, bạn nên có những kiến ​​thức cơ bản về Python trong khóa LẬP TRÌNH PYTHON BẢN CƠ

Nếu bạn chưa có thời gian để học hết khóa trên thì hãy đảm bảo đã tìm hiểu những kiến ​​thức sau đây

Và đương nhiên để học tiếp bài sau, bạn phải ôm kiến ​​thức ở các bài trước

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Lớp là gì ?
  • Thuộc tính là gì ?
  • Hàm khởi tạo (khởi tạo phương thức)
  • Phương thức là gì ?

Lớp là gì ?

Nếu hỏi một người bạn đã biết về lập trình hướng đối tượng (bất kể ngôn ngữ nào) rằng bạn nghĩ đến từ bất kỳ lần đầu tiên nào khi nói về OOP có lẽ hầu hết câu trả lời nhận được sẽ là. class (Hay tieng viet la layer)

Vì vậy, lớp học là gì? . Ở đó ta khai báo các thuộc tính (attribute) và phương thức (method) Mô tả miêu tả để từ đó ta tạo ra được các đối tượng (đối tượng)

Lưu ý. double when object people ta also can write as instance, tuy it's not sát nghĩa cho lắm. Bạn không cần bận tâm lắm đâu vì vào ví dụ ta sẽ hiểu thêm, còn nếu bạn muốn hiểu kỹ thì hãy chiêm ngưỡng câu tiếng Anh sau. “Đối tượng là thể hiện của các loại. 42 là một thể hiện của kiểu int tương đương với 42 là một đối tượng int”

Cú pháp để tạo một lớp

lớp

# mã số

Giả sử ta tạo một lớp để miêu tả siêu nhân

class SieuNhan:
    pass # lệnh giữ chỗ


Lưu ý. theo tiêu chuẩn PEP8 về đặt tên của lớp (lớp) thì sẽ được viết theo kiểu CapWords. Bạn có thể theo hoặc không theo, vì đây chỉ là mã định dạng chuẩn Python thôi

Rồi nào, ta đã có khuôn mẫu của siêu nhân rồi, cái ta cần là một đối tượng thuộc lớp siêu nhân

class SieuNhan:
    pass

sieu_nhan_A = SieuNhan() # sieu_nhan_A chính là một object thuộc lớp SieuNhan
print(sieu_nhan_A)

Kết quả

<__main__.SieuNhan object at 0x0106CD10>

__chủ yếu__. SieuNhan nghĩa là đây là đối tượng thuộc lớp SieuNhan ở hàm main (có nghĩa là ở file ta đang chạy thực thi) kèm theo cái nơi ở của nó – thứ mà ta không cần bận tâm lắm lúc này


Thuộc tính là gì?

Siêu nhân (SN) của ta chưa có thuộc tính gì, ta cần phải giúp SN có thêm một vài thuộc tính. Khi khai báo thuộc tính cho một đối tượng, bạn phải xác định các thuộc tính để giúp ta có thể phân biệt nó với những đối tượng khác cùng lớp, ví dụ như giữa 2 thằng con trai đừng lấy giới tính ra để phân biệt.

Vì sao nghĩ tới siêu nhân, ta nghĩ tới cái gì?

Bạn đọc xem đoạn code ví dụ dưới đây để biết khai báo thuộc tính ĐƠN GIẢN và cách lấy thuộc tính

________số 8

Kết quả

Ten cua sieu nhan la: Sieu nhan do
Sieu nhan mau: Do
Su dung vu khi: Kiem

Lưu ý là thuộc tính nào mới lấy ra được nhé, chứ cái lớp của chúng ta không tự động sinh ra thuộc tính đâu.

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
0

Kết quả

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
1

Hàm khởi tạo (khởi tạo phương thức)

Mở rộng vấn đề, ta cần tuyên bố khoảng 1000 siêu nhân. Việc giải thích một siêu nhân có 3 thuộc tính như trên vị trí chi ta sẽ mất 3000 dòng thông báo. Tuy nhiên, bạn vẫn có thể khai báo chỉ bằng 1000 dòng bằng cách khai báo một lớp lót của Python tuy nhiên đôi khi các thuộc tính của đối tượng không dễ dàng để khai báo một cách đơn giản như vậy

Ta cần phải có một khuôn mẫu mà chỉ cần đưa các giá trị khuôn mẫu vào còn việc gán giá trị thì để làm khuôn mẫu. Dĩ nhiên khuôn mẫu có thể, nếu ta xây dựng cho nó một hàm tạo hàm

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
2

Lưu ý. 2 dấu gạch “_” bắt đầu và kết thúc

Giải thích một vài điều, đây là tên hàm được quy ước, nếu bạn đặt tên hàm như vậy, bạn mặc định nói với chương trình rằng đây là hàm tạo (nó là gì thì bạn từ từ sẽ biết). Trong Python, một số hàm trong lớp sẽ được gọi tự động khi ta khai báo một đối tượng và hàm tạo là một trong số các hàm đó

Từ khóa self hay cụ thể ở đây là tham số self là một quy ước (lưu ý là hoàn toàn sẽ không bị bắt lỗi cú pháp nếu sử dụng từ khóa khác), bạn có thể sử dụng một từ khóa khác. Tuy nhiên, từ trước đến giờ mình chưa thấy ai sử dụng một từ khóa khác ngoài bản thân. Nếu bạn không muốn gây hiểu lầm cho người khác thậm chí chí khiến người khác nghĩ là bạn viết mã sai thì bạn nên sử dụng từ khóa self

Do đó, từ khóa self là gì? . Ý nghĩa của nó là đối tượng chính. Hơi khó hiểu nhỉ?

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
3

Đầu tiên, từ khóa self sẽ nhận giá trị chính là đối tượng đã gọi hàm đó. Ủ? . Và đương nhiên, self được gán bằng đối tượng sieu_nhan_A, các đối số “do”, “Kiem”, “Do” còn lại sẽ được truyền vào theo tứ tự. Bạn hãy thử xem lại cách thủ công khai báo thuộc tính khi ban đầu, bạn sẽ thấy nó tương tự

Bạn nên nhớ rằng mỗi khi có một đối tượng nào gọi một hàm thì bao giờ cũng tối thiểu sẽ có một đối số được gửi vào hàm đó chính là đối tượng chính đó, nếu hàm đó không có tham số nhận thì sẽ sinh ra lỗi, còn nếu hàm đó không có tham số nhận thì sẽ sinh ra lỗi, còn nếu hàm đó không có tham số nhận thì sẽ sinh ra lỗi. . Còn nếu gửi vào vẫn không có lỗi thì…Bug này nghiêm trọng khó sửa đây

When ta try in các thuộc tính

class Person:

    def __new__(cls):
        return object.__new__(cls)

    def __init__(self):
        self.instance_method()

    def instance_method(self):
        print('success!')

personObj = Person()
4

Kết quả

Ten cua sieu nhan la: Sieu nhan do
Sieu nhan mau: Do
Su dung vu khi: Kiem

Phương thức là gì?

Time ta try help SN of them ta có một câu giới thiệu. Ta tạo một hàm để làm điều đó

class SieuNhan:
    pass

sieu_nhan_A = SieuNhan() # sieu_nhan_A chính là một object thuộc lớp SieuNhan
print(sieu_nhan_A)
1

Kết quả

class SieuNhan:
    pass

sieu_nhan_A = SieuNhan() # sieu_nhan_A chính là một object thuộc lớp SieuNhan
print(sieu_nhan_A)
2

Thông thường, khi nói tới hàm của lớp, người ta hay gọi là phương thức (phương thức). Khi nói tới hàm thì nó là chương trình bé bé chờ bạn thực thi, còn khi gọi nó là phương thức thì nó là hàm nhưng liên quan tới lớp thôi. Người ta thường hay « hàm gọi », « phương thức gọi ». Nhớ đừng nhầm lẫn nhé, người ta cười cho đấy


Kết luận

Bài này đã giúp bạn nắm bắt được những khái niệm cơ bản của lớp và đối tượng trong Python

Ở bài tiếp theo, ta sẽ tìm hiểu về KHAI BÁO THUỘC TÍNH TRONG LỚP

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc đóng góp ý kiến ​​của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không sợ khó”


Thảo luận

Nếu bạn gặp bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam. com to get the support from the community