Hướng dẫn self outside of class python - bản thân bên ngoài lớp học python

Cảm giác như bạn muốn Monkey vá một phương pháp trên này. Nếu vậy, sau đó chào mừng bạn đến với Dark Side Young. Hãy để chúng tôi bắt đầu nghi lễ bị nguyền rủa. Về bản chất bạn muốn miếng vá khỉ. Tất cả những gì chúng ta cần là một chút máu khỉ. Đùa thôi. Chúng ta cần

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'
5. Nhưng lưu ý rằng bạn không thể Monkey Patch Stdlib loại:

>>> from types import MethodType
>>> def palindrome(self): return self == self[::-1]
...
>>> str.palindrome = MethodType(palindrome, str)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'str'

Nhưng điều đó sẽ không ngăn bạn gây ra sự tàn phá trong các lớp khác:

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'

Bạn thấy điều đó dễ dàng như thế nào? Nhưng chúng tôi mới bắt đầu. Đây chỉ là một ví dụ đơn thuần cho phép giết

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'
6 bây giờ? Phần tiếp theo sẽ khiến bạn cười một cách điên cuồng:

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'

Sau này, nếu bạn không cảm thấy xấu xa. Sau đó, bạn phải đến Lair Evil của tôi, nơi tôi sẽ cho bạn thấy nhiều thủ thuật xấu xa và chia sẻ bánh quy.

Nếu bạn đã làm việc trên Python, bạn có thể có biến bản thân. Bạn có thể tìm thấy nó trong các định nghĩa phương thức và trong việc khởi tạo các biến. Tuy nhiên, trước khi đến & nbsp; tự biến, chúng ta hãy có ý tưởng về các lớp và trường hợp trong Python. & Nbsp; Đây là một bài viết về & nbsp; sys.argv & nbsp; đối số dòng lệnh & nbsp; để cung cấp cho bạn sự hiểu biết sâu sắc hơn. & nbsp;self variable. You can find it in method definitions and in initializing variables. However, before coming to the self variable, let us have an idea about classes and instances in Python. Here is an article about sys.argv command line argument to give you deeper understanding.    

Phương pháp thể hiện và phương pháp lớp trong Python là gì?

Bạn có thể đã nghe nói về các trường hợp và lớp học trong khi làm việc trên Python. Các biến lớp được xác định trong một lớp và chúng được chia sẻ với tất cả các trường hợp (đối tượng) của lớp trong khi các biến thể hiện được sở hữu bởi các trường hợp của một lớp. Đối với các trường hợp khác nhau, các biến thể hiện là khác nhau. & NBSP;

Tương tự như vậy, Python cũng chứa các phương thức và phương thức thể hiện lớp. Các phương pháp lớp thông báo về tình trạng của lớp. Mặt khác, các phương thức thể hiện là đặt hoặc nhận chi tiết về các thể hiện hoặc đối tượng. & nbsp;

& nbsp; nếu bạn muốn xác định một phương thức thể hiện, tham số quan trọng nhất của phương thức phải luôn luôn phải là bản thân. Hãy cho chúng tôi hiểu điều này với sự trợ giúp của mã ví dụ - & nbsp;self. Let us understand this with the help of example code – 

class myClass: 
    def instance_method(self): 
        return “Instance method is called”, self 

Phương thức của Instance_Method, & nbsp; là một phương thức thể hiện thông thường. Phương thức chấp nhận một tham số duy nhất - tự. Biến bản thân chỉ vào một thể hiện của lớp myClass khi phương thức bị thu hồi. Mặc dù phương thức chỉ mất một tham số ở đây, nhưng nó cũng có thể chấp nhận nhiều hơn một tham số. & Nbsp;“instance_method” is a regular instance method. The method accepts one single parameter – self. The self variable points to an instance of the class myClass when the method is revoked. Though the method takes only one parameter here, it can also accept more than one parameter. 

Các phương thức thể hiện có thể dễ dàng truy cập các thuộc tính khác nhau và các phương thức khác trên cùng một đối tượng với sự trợ giúp của biến bản thân. Biến bản thân cũng có khả năng sửa đổi trạng thái của một đối tượng và sử dụng bản thân .__ Lớp __ & nbsp; Thuộc tính, các phương thức thể hiện cũng có thể truy cập lớp. Do đó, các phương thức thể hiện cũng có thể sửa đổi trạng thái lớp. & NBSP;self.__class__  attribute, instance methods can also access the class. Thus, the instance methods are also able to modify the class state. 

Bây giờ, chúng ta hãy xem những gì xảy ra khi chúng ta gọi là Instance_method,: & nbsp;“instance_method”: 

>>>obj = myClass() 
>>>obj.instance_method() 
('Instance method is called', <myClass instance at 1x09255d103>) 

Điều này cho thấy rằng Instance_method, & nbsp; có thể truy cập phiên bản đối tượng (được in dưới dạng & nbsp;) thông qua tham số self & nbsp;. Điều xảy ra là tham số tự được thay thế bằng đối tượng thể hiện obj & nbsp; khi phương thức được gọi. Tuy nhiên, nếu bạn vượt qua đối tượng thể hiện theo cách thủ công, bạn sẽ nhận được kết quả tương tự như trước: & nbsp;“instance_method” can access the object instance (printed as ) through the self parameter. What happens is that the self parameter is replaced with the instance object obj when the method is called. However, if you pass the instance object manually, you will get the same result as before: 

>>>myClass.instance_method(obj) 
('Instance method is called', <myClass instance at 1x09255d103>) 

Lưu ý rằng bản thân thực sự không phải là một từ khóa được xác định trong Python mà là một quy ước.

& Nbsp; self & nbsp; trong python? & Nbsp;Self in Python? 

Không giống như điều này & nbsp; biến trong C ++, self & nbsp; không phải là một từ khóa thay vì nó là một quy ước mã hóa hơn. Nó đại diện cho thể hiện hoặc đối tượng của một lớp và liên kết các thuộc tính của một lớp với các đối số cụ thể. Việc sử dụng biến bản thân trong Python giúp phân biệt giữa các thuộc tính (và phương thức) và các biến cục bộ. & NBSP;this variable in C++, self is not a keyword rather it is more of a coding convention. It represents the instance or objects of a class and binds the attributes of a class with specific arguments. The use of self variable in Python helps to differentiate between the instance attributes (and methods) and local variables. 

Nếu bạn không muốn các biến của lớp được chia sẻ bởi tất cả các trường hợp của lớp, bạn có thể khai báo các biến trong lớp của bạn mà không cần bản thân. Hãy cho chúng tôi hiểu điều này với một ví dụ: & nbsp;

class Car: 
    def __init__(self, model): 
self.model = model 
    def Car_info(self): 
print("Model : ", self.model) 

Ở đây, chúng tôi đã tuyên bố một chiếc xe lớp & nbsp; với một biến thể hiện self.model & nbsp; = model. Giá trị của biến thể hiện sẽ là duy nhất cho các đối tượng thể hiện của lớp có thể được khai báo. Tuy nhiên, nếu bạn muốn các biến được chia sẻ bởi tất cả các trường hợp của lớp, bạn cần khai báo các biến thể hiện không có bản thân. Nếu không, nó sẽ không rõ ràng vì tất cả các xe sẽ có cùng một mô hình. & NBSP;Car with one instance variable self.model = model. The value of the instance variable will be unique to the instance objects of the class that might be declared. However, if you want the variables to be shared by all instances of the class, you need to declare the instance variables without self. Otherwise, it would be ambiguous since all cars will have the same model. 

Cần bản thân trong Python & nbsp; 

Biến bản thân được sử dụng để biểu diễn thể hiện của lớp thường được sử dụng trong lập trình hướng đối tượng. Nó hoạt động như một tham chiếu đến đối tượng. Python sử dụng tham số tự để chỉ các thuộc tính và phương thức thể hiện của lớp. & nbsp;

Không giống như các ngôn ngữ lập trình khác, Python không sử dụng cú pháp & nbsp; Đây là lý do duy nhất tại sao bạn cần sử dụng biến bản thân trong Python. Ngôn ngữ chứa các phương thức cho phép thể hiện được truyền tự động nhưng không được nhận tự động. & NBSP; “@” syntax to access the instance attributes. This is the sole reason why you need to use the self variable in Python. The language contains methods that allow the instance to be passed automatically but not received automatically. 

Định nghĩa rõ ràng về bản thân & nbsp; 

Zen of Python cho biết, rõ ràng là tốt hơn so với tiềm ẩn. Có một vài lý do cho điều này. & NBSP;Zen of Python says “Explicit is better than Implicit”. Programmers of other languages often ask why self is passed as an explicit parameter every time to define a method. There are a few reasons for this. 

Thứ nhất, vì Python sử dụng thuộc tính phương thức hoặc phiên bản thay vì biến cục bộ khi chúng ta đọc self.name hoặc self.age, nó cho thấy hoàn toàn rõ ràng rằng bạn đang sử dụng một biến hoặc phương thức thể hiện ngay cả khi bạn không có kiến ​​thức về định nghĩa lớp. & nbsp;self.name or self.age, it makes it absolutely clear you are using an instance variable or method even if you have no knowledge about the class definition. 

Thứ hai, nếu bạn đề cập rõ ràng hoặc gọi một phương thức từ một lớp cụ thể trong Python, bạn không cần phải sử dụng bất kỳ cú pháp đặc biệt nào cho điều đó. & nbsp;

Cuối cùng, lý do thứ ba là định nghĩa rõ ràng về bản thân giúp Python hiểu có nên gán cho một biến thể hiện hay cho một biến cục bộ. Về mặt đơn giản hơn, các biến và trường hợp cục bộ tồn tại trong hai không gian tên riêng biệt và chúng ta cần thông báo cho Python nên sử dụng không gian tên nào. & NBSP;

Trình tự xây dựng lớp Python là gì? & NBSP; 

Biến bản thân trong Python cũng có thể được sử dụng để truy cập một trường biến trong định nghĩa lớp. Hãy cho chúng tôi hiểu điều này với sự trợ giúp của mã ví dụ: & nbsp;

Học sinh lớp: & NBSP;

    def __init__(self, Alex): 
        self.name = Alex    #name created in constructor 
    def get_student_name(self): 
        return self.name 

Trong ví dụ trên, tự đề cập đến tuổi biến đổi & nbsp; của học sinh lớp. & Nbsp; tuổi biến & nbsp; là cục bộ với phương pháp. Trong khi phương thức đang chạy, tuổi biến đổi & nbsp; tồn tại trong lớp. & Nbsp;age of the class Student. The variable age is local to the method. While the method is running, the variable age exists within the class. 

Nếu có một biến trong một phương thức, biến bản thân sẽ không hoạt động. Nếu bạn muốn xác định các trường toàn cầu, bạn cần xác định các biến bên ngoài các phương thức lớp. & nbsp; & nbsp;

Tự là một từ khóa trong Python? & Nbsp; 

Có một câu hỏi luôn luôn lơ lửng giữa các lập trình viên Python. Tự thực sự là một từ khóa trong Python? & Nbsp;

Không giống như các ngôn ngữ lập trình khác như C ++, trong đó bản thân được coi là một từ khóa, trong Python, đó là một quy ước mà các lập trình viên có xu hướng tuân theo. Nó về cơ bản là một tham số trong một định nghĩa phương thức. Tuy nhiên, bạn có thể sử dụng bất kỳ tên nào khác thay cho bản thân như một & nbsp; hoặc tôi & nbsp; hoặc bất cứ điều gì khác cho tham số đầu tiên của phương thức. Một lý do khác tại sao nó được đề xuất bởi hầu hết mọi người là nó tăng cường khả năng đọc mã của bạn. & NBSP;another or me or anything else for the first parameter of a method. Another reason why it is suggested by most people is that it enhances the readability of your code. 

Hãy cho chúng tôi xem một ví dụ để hiểu nó: & nbsp;

class myClass:  
def show(another):  
print(“another is used in place of self”)  

Nếu bạn so sánh mã này với mã cho hàm tạo tự cấu trúc lớp Python, bạn sẽ nhận thấy rằng ở đây chúng tôi đã sử dụng tên khác & nbsp; thay cho bản thân. Bây giờ chúng ta hãy tạo một đối tượng của lớp này và xem đầu ra: & nbsp;another in place of self. Now let us create an object of this class and see the output: 

object = myClass()  
object.show()

Một cái khác được sử dụng thay cho bản thân

Bạn có thể thấy rằng chương trình hoạt động ngay cả khi chúng ta sử dụng một số tên khác thay cho biến bản thân. Nó hoạt động chính xác giống như biến bản thân. & NBSP;

Tại sao "tự" nên được sử dụng làm tham số đầu tiên của các phương thức thể hiện trong Python & nbsp; & nbsp; 

Điều này có thể được hiểu bởi ví dụ dưới đây. Chúng tôi có một lớp hình chữ nhật xác định một khu vực phương thức để tính toán khu vực: & nbsp;

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
0

Output:   

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
1

Trong ví dụ trên, __init __ () & nbsp; xác định ba tham số nhưng chỉ có 2 đối số được truyền (6 và 10). Tương tự, khu vực () & nbsp; yêu cầu một nhưng không có đối số nào được thông qua. & nbsp;__init__() defines three parameters but only 2 arguments are passed (6 and 10). Similarly, area () requires one but no arguments are passed.  

Hình chữ nhật.area & nbsp; và rec1.area & nbsp; trong ví dụ trên là khác nhau và không chính xác như nhau. & Nbsp; and rec1.area in the above example are different and not exactly the same. 

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
2

Ở đây, cái đầu tiên là một hàm và cái thứ hai là một phương pháp. Một tính năng độc đáo của Python là bản thân đối tượng được truyền như là đối số đầu tiên cho hàm tương ứng. & NBSP;

Trong ví dụ trên, phương thức gọi: rec1.area () tương đương với: hình chữ nhật.area (rec1). & Nbsp;

Nói chung, khi phương thức được gọi với một số đối số, hàm lớp tương ứng được gọi bằng cách đặt đối tượng của phương thức trước đối số đầu tiên. & nbsp;

Do đó: obj.method (args) trở thành class.method (obj, & nbsp; args). & Nbsp;obj.method(args) becomes Class.method(obj, args)

Đây là lý do tham số đầu tiên của một hàm trong một lớp phải là chính đối tượng. Viết tham số này là bản thân chỉ là một quy ước và không phải là một từ khóa nên nó không có ý nghĩa đặc biệt trong Python. Chúng ta có thể sử dụng các tên khác (như thế này, điều đó) nhưng nó không được ưa thích vì nó làm giảm khả năng đọc mã.

Chúng ta có nên chuyển bản thân cho một phương pháp không? & Nbsp; 

Vì chúng ta có thể sử dụng bất kỳ tên nào khác thay vì sử dụng biến bản thân, thì điều gì sẽ xảy ra nếu chúng ta chỉ chuyển bản thân cho một định nghĩa phương thức. Chúng ta hãy xem xét lớp MyClass & NBSP; chúng ta đã sử dụng trước đó. & nbsp;myClass we have used earlier.  

Một phương thức có tên là một cái gì đó & nbsp; được xác định trong lớp với một tham số khác & nbsp; và hai đối số: & nbsp;something is defined within the class with a parameter another and two arguments: 

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
3

Bây giờ, chúng ta hãy khai báo một trường hợp obj & nbsp; của myClass & nbsp; và gọi phương thức một cái gì đó & nbsp; với sự trợ giúp của đối tượng thể hiện: & nbsp;obj of myClass and call the method something with the help of the instance object: 

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
4

Python thực hiện một công việc nội bộ trong cuộc gọi phương thức và chuyển đổi nó thành một cái gì đó như thế này: & nbsp;

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
5

Điều này cho thấy rằng một biến khác & nbsp; biến (được sử dụng thay cho bản thân) đề cập đến đối tượng thể hiện của lớp. & Nbsp;another variable (used in place of self) refers to the instance object of the class. 

Lưu ý rằng Pass & nbsp; từ khóa được sử dụng trong phương thức một cái gì đó & nbsp; không làm gì cả. Nó được sử dụng như một hình nộm trong các tình huống mà bạn không muốn bất kỳ hoạt động nào được thực hiện nhưng có một yêu cầu cú pháp của một yếu tố lập trình nhất định. & NBSP;pass keyword used in the method something does nothing. It is used as a dummy in situations where you do not want any operation to be performed but there is a syntax requirement of a certain programming element. 

Làm thế nào chúng ta có thể bỏ qua bản thân trong Python? & NBSP; 

Xem xét một tình huống trong đó phương thức thể hiện không cần phải có quyền truy cập vào các biến thể hiện. Trong những trường hợp như vậy, chúng ta có thể xem xét bỏ qua biến bản thân trong các phương pháp xác định. Hãy để chúng tôi hiểu rõ về thực tế với mã ví dụ: & nbsp;

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
6

Nếu bạn chạy mã sau, đầu ra sẽ như sau: & nbsp;

Complete 

Chúng tôi đã không tuyên bố biến bản thân ở đây nhưng vẫn không có lỗi trong chương trình và đầu ra xuất hiện tốt. Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta gọi phương thức xe (): & nbsp;Car() method: 

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
7

Khi chúng tôi biên dịch mã sau khi gọi phương thức & nbsp; car (), nó sẽ hiển thị một lỗi như thế này: & nbsp; Car() method, it shows an error like this: 

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
8

Đầu ra cho thấy một lỗi vì phương thức & nbsp; car () có 0 đối số vị trí nhưng chúng tôi đã đưa ra 1 đối số vị trí cho nó. Điều này là do khi trường hợp obj & nbsp; được tạo, nó sẽ tự động được chuyển làm đối số đầu tiên cho phương thức xe () ngay cả khi chúng ta không tuyên bố biến bản thân. & NBSP; Car() takes 0 positional arguments but we have given 1 positional argument to it. This is because when the instance obj is created, it is automatically passed as the first argument to the method Car() even if we have not declared the self variable. 

Tuy nhiên, nếu bạn cố gắng truy cập vào phương thức phiên bản () & nbsp; với sự trợ giúp của tham chiếu lớp, sẽ không có lỗi và chương trình sẽ hoạt động tốt: & nbsp;Car() with the help of the class reference, there will be no errors and the program will work fine: 

>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("stanley yelnats")
>>> def palindrome(self): return self.done[::-1]
>>> s.palindrome = MethodType(palindrome, s)
>>> s.palindrome()
'stanley yelnats'
9

Sự khác biệt giữa bản thân và __init __ & nbsp; & nbsp; 

tự & nbsp;: tự đại diện cho trường hợp của lớp. Bằng cách sử dụng từ khóa "tự", tất cả các thuộc tính và phương thức của lớp Python có thể được truy cập. & NBSP;: self represents the instance of the class. By using the "self" keyword all the attributes and methods of the python class can be accessed. 

__init__: "__init__" là một phương pháp dành riêng trong các lớp Python. Nó được biết đến như một hàm tạo trong các khái niệm định hướng đối tượng. Phương thức này được gọi là khi một đối tượng được tạo từ lớp và cho phép lớp khởi tạo các thuộc tính lớp .. & nbsp; "__init__" is a reserved method in python classes. It is known as a constructor in object oriented concepts. This method is called when an object is created from the class and allows the class to initialize class attributes .. 

Việc sử dụng "bản thân" trong lớp để truy cập các phương thức và thuộc tính: & nbsp;

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'
0

Output:   

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'
1

Chúng tôi đã tạo ra một đối tượng của lớp hình chữ nhật. Trong khi tạo đối tượng hình chữ nhật, chúng tôi đã vượt qua 3 đối số - 40.30.100; & nbsp; tất cả các đối số này được chuyển sang phương thức "__init __" để khởi tạo đối tượng. & Nbsp;– 40,30,100; all these arguments are passed to "__init__"method to initialize the object. 

Ở đây, từ khóa "tự sướng đại diện cho thể hiện của lớp. Nó liên kết các thuộc tính với các đối số đã cho. & Nbsp;"self” represents the instance of the class. It binds the attributes with the given arguments. 

Tự đại diện cho cùng một đối tượng hoặc thể hiện của lớp. Nếu bạn thấy, bên trong phương thức "Khu vực, Self.length" được sử dụng để nhận giá trị của "Độ dài" thuộc tính. Thuộc tính "Độ dài" liên kết với đối tượng (thể hiện của lớp) tại thời điểm tạo đối tượng. "Tự" đại diện cho đối tượng bên trong lớp. "Self" hoạt động giống như "r" trong câu lệnh r = hình chữ nhật (40,30, 100) ". Nếu bạn thấy định nghĩa phương thức" khu vực def (self): ở đây "tự" Phương thức bởi vì bất cứ khi nào chúng ta gọi phương thức, đối tượng (thể hiện của lớp) được tự động truyền dưới dạng đối số đầu tiên cùng với các đối số khác của phương thức. Nếu không có đối số nào khác chỉ được cung cấp "Tự" được chuyển cho phương thức. Đó là lý do "bản thân" được sử dụng để gọi phương thức bên trong lớp ("self.area ()"). Chúng tôi đã sử dụng đối tượng (ví dụ của lớp) để gọi phương thức bên ngoài định nghĩa lớp ("R.area ()"). & nbsp;

"R" là ví dụ của lớp khi phương thức "r.area () được gọi là; trường hợp" r "được chuyển làm đối số đầu tiên ở vị trí của bản thân. & nbsp;

Thực hiện linh tinh của bản thân & nbsp; 

Bây giờ chúng ta hãy thảo luận về một số triển khai linh tinh của biến bản thân. & NBSP;

Các biến tương tự cho phương thức lớp và phương thức tĩnh & nbsp;

Phương thức lớp là một phương thức bị ràng buộc với lớp. Hãy cho chúng tôi hiểu một phương thức lớp với một ví dụ - & nbsp;

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'
2

Hành vi tương tự của biến bản thân cũng có với các phương thức lớp nhưng sự khác biệt duy nhất là đối với các phương thức lớp, quy ước là sử dụng CLS & nbsp; làm tên biến thay vì bản thân. & NBSP;cls as the variable name instead of self. 

Các phương thức lớp lấy tham số CLS & NBSP; thay vì tham số tự. Khi phương thức được gọi, nó chỉ vào lớp. Phương thức lớp không thể sửa đổi trạng thái đối tượng nhưng nó có thể sửa đổi trạng thái lớp của tất cả các trường hợp lớp. & NBSP;cls parameter instead of the self parameter. When the method is called, it points to the class. The class method cannot modify the object state but it can modify the class state of all the class instances. 

Mặt khác, các phương thức tĩnh là các hàm tự cung cấp và loại phương thức này không phải là tự & nbsp; cũng không phải là tham số cls & nbsp;. Hãy cho chúng tôi xem một ví dụ về phương pháp tĩnh - & nbsp;self nor a cls parameter. Let us see an example of a static method – 

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'
3

Vì một phương thức tĩnh không chấp nhận bất kỳ tham số nào, chúng không thể sửa đổi trạng thái đối tượng hoặc thậm chí trạng thái lớp. Chúng chủ yếu được sử dụng để đặt tên các phương pháp khác nhau và Python hạn chế chúng trong dữ liệu mà chúng có thể truy cập. & NBSP;

Lưu ý rằng cả hai phương thức ở đây được đánh dấu bằng @ClassMethod và @staticmethod & nbsp; trang trí để gắn cờ nó như một phương thức lớp và phương thức tĩnh tương ứng. & Nbsp;@classmethod and @staticmethod decorators to flag it as a class method and static method respectively. 

Biến bản thân được liên kết với thể hiện hiện tại & nbsp;

Biến bản thân cho phép chúng tôi truy cập các thuộc tính của thể hiện hiện tại. Hãy cho chúng tôi hiểu điều này với một ví dụ - & nbsp;

>>> from types import DynamicClassAttribute
>>> class String(object):
...     def __init__(self, done):
...         self.done = done
...
...
...
>>> s = String("cheese")
>>> def palindrome(self): return self.done[::-1];
...
>>> String.palindrome = DynamicClassAttribute(palindrome)
>>> s.palindrome
'eseehc'
4

Ở đây, chúng tôi có một người lớp & nbsp; với hai phương thức __init__ và Walk & nbsp; được tuyên bố với tham số tự. Chúng tôi đã tạo ra hai trường hợp khác nhau của lớp - obj1 & nbsp; và obj2. & Nbsp; thuộc tính của phương thức ví dụ đi bộ (). & nbsp;Person with two methods __init__ and walk declared with the self parameter. We have created two different instances of the class – obj1 and obj2. When the first instance is revoked, “Alex” is printed with the method walk() whereas when the second instance is revoked, “Charles” gets printed with the properties of the instance method walk(). 

Lời khuyên về biến bản thân Python & NBSP; 

Vì bây giờ chúng tôi đã đạt đến cuối bài viết, hãy để tôi cung cấp cho bạn một số lời khuyên về thời điểm sử dụng và khi nào không sử dụng biến bản thân trong Python. & NBSP;

Sử dụng bản thân khi nào:self when:

  • Bạn xác định một phương thức thể hiện, vì nó được truyền tự động là tham số đầu tiên khi phương thức được gọi;
  • bạn tham chiếu một lớp hoặc một thuộc tính thể hiện từ bên trong một phương thức thể hiện;
  • Bạn muốn tham khảo các biến và phương thức thể hiện từ các phương thức thể hiện khác. & nbsp;

Don Tiết sử dụng bản thân khi: & nbsp;self when: 

  • Bạn muốn gọi một phương thức thể hiện bình thường;
  • tham chiếu một thuộc tính lớp bên trong định nghĩa lớp nhưng ngoài một phương thức thể hiện;
  • Bạn đang ở trong một phương pháp tĩnh. & nbsp;

Conclusion  

Hãy để chúng tôi tóm tắt lại các điểm chính mà chúng tôi đã đề cập trong bài viết này, cụ thể là:

  • Các trường hợp và các lớp trong Python. & Nbsp;
  • Tự biến và tầm quan trọng của nó. & Nbsp;
  • Tính rõ ràng của biến bản thân. & Nbsp;
  • Trình tự xây dựng lớp Python. & NBSP;
  • Vượt qua bản thân như một phương pháp. & Nbsp;
  • Bỏ qua bản thân trong Python. & NBSP;
  • Các biến được sử dụng cho các phương thức lớp và phương thức tĩnh. & Nbsp;
  • Giới hạn bản thân với thể hiện hiện tại. & NBSP;
  • Khi nào nên sử dụng và khi nào không sử dụng bản thân trong Python. & NBSP;

Với kiến ​​thức tốt về biến bản thân trong Python và hoạt động nội bộ của nó ở Python, giờ là lúc cho một số thực hành. Tuy nhiên, nếu bạn muốn biết thêm về bản thân Python, bạn có thể đi ngay vào tài liệu chính thức của Python.

Mã hóa hạnh phúc! & NBSP;

Bạn có thể sử dụng bản thân bên ngoài một python lớp không?

Ví dụ - bản thân. var_name. Nếu bạn muốn sử dụng biến đó ngay cả bên ngoài lớp, bạn phải khai báo biến đó là toàn cầu. Sau đó, biến có thể được truy cập bằng tên của nó bên trong và bên ngoài lớp và không sử dụng thể hiện của lớp.you must declared that variable as a global. Then the variable can be accessed using its name inside and outside the class and not using the instance of the class.

Tôi có thể sử dụng bản thân trong ClassMethod Python không?

Tự là một quy ước và không phải là một từ khóa Python.Tự là tham số trong phương thức ví dụ và người dùng có thể sử dụng một tên tham số khác thay cho nó.Nhưng nên sử dụng bản thân vì nó làm tăng khả năng đọc của mã, và nó cũng là một thực hành lập trình tốt.

Bản thân __ có nghĩa là gì trong Python?

Tự: Tự đại diện cho trường hợp của lớp.Bằng cách sử dụng từ khóa "tự", tất cả các thuộc tính và phương thức của lớp Python có thể được truy cập.__init__: "__init__" là một phương pháp dành riêng trong các lớp Python.Nó được biết đến như một hàm tạo trong các khái niệm định hướng đối tượng.represents the instance of the class. By using the "self" keyword all the attributes and methods of the python class can be accessed. __init__ : "__init__" is a reserved method in python classes. It is known as a constructor in object oriented concepts.

__ init __ (tự ý nghĩa là gì?

__init__ là hàm tạo cho một lớp.Tham số tự đề cập đến thể hiện của đối tượng (như thế này trong C ++).The self parameter refers to the instance of the object (like this in C++).