Hướng dẫn pass self to class method python - truyền phương thức tự vào lớp python

8

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi đang cố gắng để hiểu các phương pháp lớp. Từ những gì tôi đã đọc, có vẻ như các phương thức lớp chúng ta phải truyền CLS làm đối số đầu tiên trong khi xác định (tương tự như các phương thức thể hiện trong đó chúng ta truyền cho bản thân là đối số đầu tiên). Nhưng tôi thấy rằng ngay cả khi tôi vượt qua bản thân là đối số đầu tiên cho một phương thức lớp nó hoạt động. Ai đó có thể giải thích cho tôi cách thức hoạt động của nó?

Tôi đã thấy một số cách sử dụng trong đó họ đã định nghĩa lớp là một phương pháp lớp nhưng họ vẫn tự vượt qua bản thân là đối số đầu tiên thay vì CLS. Tôi đang cố gắng để hiểu cách sử dụng.

#!/usr/bin/python


class A(object):
    def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)

    @classmethod
    def class_foo(self,x):
        print "executing class_foo(%s,%s)"%(self,x)


>>> A.class_foo(2)
executing class_foo(<class '__main__.A'>,2)
>>>

Hướng dẫn pass self to class method python - truyền phương thức tự vào lớp python

Rahul Nikate

6.0325 Huy hiệu vàng41 Huy hiệu bạc53 Huy hiệu Đồng5 gold badges41 silver badges53 bronze badges

Hỏi ngày 28 tháng 11 năm 2014 lúc 10:09Nov 28, 2014 at 10:09

Việc sử dụng

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
5 và
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
6 chỉ là một quy ước đặt tên. Bạn có thể gọi cho họ bất cứ điều gì bạn muốn (mặc dù không!). Vì vậy, bạn vẫn đi trong đối tượng lớp, bạn chỉ đặt tên cho nó là
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
5, thay vì
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
6.don't though!). As such you're still passing in the class object, you've just named it
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
5, rather than
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
6.

99,999% các lập trình viên Python sẽ mong đợi bạn gọi họ là

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
5 và
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
6, cũng rất nhiều IDE sẽ phàn nàn nếu bạn gọi cho họ bất cứ điều gì ngoại trừ
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
5 và
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
6, vì vậy vui lòng bám vào quy ước.

Đã trả lời ngày 28 tháng 11 năm 2014 lúc 10:11Nov 28, 2014 at 10:11

FfisegyddffisegyddFfisegydd

49.1K14 Huy hiệu vàng141 Huy hiệu bạc118 Huy hiệu đồng14 gold badges141 silver badges118 bronze badges

1

Tôi cảm thấy như câu trả lời cuối cùng chỉ thảo luận về quy ước đặt tên của tham số đầu tiên mà không giải thích những gì tự đánh giá cho cái được gọi là phương pháp tĩnh so với phương pháp thông thường. Lấy ví dụ sau:

class A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())

Đầu ra là như sau:

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None

Lưu ý rằng phương thức

class myClass: 
    def instance_method(self): 
        return “Instance method is called”, self 
3 được gọi bởi 3 đối tượng mang lại các địa chỉ hex khác nhau, có nghĩa là đối tượng
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
5 được gắn với thể hiện. Phương pháp
class myClass: 
    def instance_method(self): 
        return “Instance method is called”, self 
5 cho thấy
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
5 thực sự đang tham khảo bản thân lớp chứ không phải là thể hiện. Đó là sự khác biệt.

Đã trả lời ngày 28 tháng 11 năm 2014 lúc 10:23Nov 28, 2014 at 10:23

Tiputiputipu

9.32413 Huy hiệu vàng64 Huy hiệu bạc98 Huy hiệu Đồng13 gold badges64 silver badges98 bronze badges

1

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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
0

Output:   

class A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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 A(object):
    def x(self):
        print(self)

    @classmethod
    def y(self):
        print(self)

a = A()
b = A()
c = A()

print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
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;

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
0

Output:   

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
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;

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
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 – 

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
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;

<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
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;

Tôi có thể chuyển tự cho một lớp python khác không?

Hoàn toàn không có vấn đề với điều đó.Bản thân chỉ là một tài liệu tham khảo cho trường hợp, nó không phải là riêng tư cũng không nguy hiểm khi chuyển nó cho các chức năng khác.. self is just a reference to the instance, it is not private nor is it dangerous to pass it to other functions.

Phương pháp lớp có thể truy cập bản thân trong Python không?

Phương pháp lớp không cần một thể hiện lớp.Họ không thể truy cập phiên bản (tự) nhưng họ có quyền truy cập vào lớp thông qua CLS.Phương pháp tĩnh không có quyền truy cập vào CLS hoặc bản thân.Chúng hoạt động như các chức năng thông thường nhưng thuộc về không gian tên của lớp.They can't access the instance ( self ) but they have access to the class itself via cls . Static methods don't have access to cls or self . They work like regular functions but belong to the class's namespace.

Làm thế nào để bạn vượt qua một lập luận tự trong Python?

Tự là đối số đầu tiên được thông qua trong phương thức xây dựng và thể hiện.Self phải được cung cấp như một tham số đầu tiên cho phương thức thể hiện và hàm tạo.Nếu bạn không cung cấp nó, nó sẽ gây ra lỗi.Self must be provided as a First parameter to the Instance method and constructor. If you don't provide it, it will cause an error.

Bản thân trong các phương pháp lớp Python là gì?

Tham số tự là 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.a reference to the current instance of the class, and is used to access variables that belongs to the class.