Self.variable vs biến python

Biến tự Python được sử dụng để liên kết thể hiện của lớp với phương thức thể hiện. Chúng ta phải khai báo rõ ràng nó là đối số phương thức đầu tiên để truy cập các biến thể hiện và phương thức. Biến này chỉ được sử dụng với các phương thức thể hiện

Trong hầu hết các ngôn ngữ lập trình hướng đối tượng, bạn có thể truy cập đối tượng hiện tại trong một phương thức mà không cần phải có nó làm tham số phương thức một cách rõ ràng. Ví dụ: chúng ta có thể sử dụng từ khóa “this” để truy cập đối tượng hiện tại trong chương trình Java. Nhưng, trong Python, chúng ta phải khai báo rõ ràng thể hiện của đối tượng là biến “self”

Bản thân Python là một từ khóa?

Biến tự Python không phải là từ khóa dành riêng. Tuy nhiên, cách tốt nhất và theo quy ước là sử dụng tên biến là “self” để tham chiếu đến thể hiện

Python tự biến Ví dụ

Giả sử chúng ta có một lớp Dog được định nghĩa như bên dưới

class Dog: def __init__(self, breed): self.breed = breed def bark(self): print(f'{self.breed} is barking.') d = Dog('Labrador') d.bark()

đầu ra. class Dog: def bark(): print('Barking') d = Dog() print("Done") 1

  • Hàm __init__() được định nghĩa với hai biến nhưng khi chúng ta tạo đối tượng Dog, chúng ta chỉ phải cung cấp một đối số. “Bản thân” được tự động gán cho thể hiện mới được tạo của lớp Dog
  • Phương thức bark() chỉ có một đối số – “self” – liên kết với đối tượng Dog gọi phương thức này. Đó là lý do tại sao chúng ta không truyền bất kỳ đối số nào khi gọi phương thức bark()
  • Nếu chúng ta phải truy cập bất kỳ biến thể hiện nào trong hàm, chúng ta có thể sử dụng toán tử dấu chấm

Chúng ta có thể bỏ qua biến "tự" không?

Điều gì sẽ xảy ra nếu phương thức thể hiện không cần truy cập các biến thể hiện. Chúng ta có thể bỏ qua biến self trong trường hợp này không?

Hãy cùng tìm hiểu với một ví dụ đơn giản

class Dog: def bark(): print('Barking') d = Dog() print("Done")

Nếu bạn chạy đoạn mã trên, sẽ không có bất kỳ lỗi nào. Nhưng, chúng tôi không gọi phương thức sủa(). Hãy xem điều gì sẽ xảy ra khi chúng ta cố gắng gọi phương thức bark()

d = Dog() d.bark()

Phương thức cá thể Python không có lỗi tự

Chúng tôi gặp lỗi khi phương thức bark() chấp nhận đối số 0 nhưng chúng tôi đã cung cấp 1. Đó là bởi vì khi chúng ta gọi class Dog: def bark(): print('Barking') d = Dog() print("Done") 0, thể hiện “d” sẽ tự động được chuyển làm đối số đầu tiên cho phương thức thể hiện bark()

Tuy nhiên, nếu chúng ta truy cập phương thức thể hiện bark() thông qua tham chiếu lớp thì nó sẽ hoạt động tốt. Vì vậy, gọi class Dog: def bark(): print('Barking') d = Dog() print("Done") 1 sẽ không gây ra bất kỳ lỗi nào

Các biến tương tự cho Phương thức lớp và Phương thức tĩnh?

Hành vi tương tự cũng xuất hiện với các phương thức Lớp. Sự khác biệt duy nhất là quy ước sử dụng “cls” làm tên biến cho tham chiếu Lớp

class Dog: @classmethod def walk(cls): print('Dog is Walking') Dog.walk()

Tuy nhiên, nó không bắt buộc với một phương thức tĩnh. Bởi vì, các phương thức tĩnh là các hàm tự cung cấp và chúng không thể truy cập trực tiếp vào bất kỳ biến hoặc hàm nào của lớp

Hãy xem một ví dụ hoàn chỉnh với các biến self và cls và một phương thức tĩnh không có bất kỳ đối số nào

class Dog: def __init__(self, breed): self.breed = breed @classmethod def walk(cls): print('Dog is Walking') # instance method def bark(self): print(f'{self.breed} is barking.') @staticmethod def add(x, y): return x + y Dog.walk() d = Dog('Labrador') d.bark() print(Dog.add(10, 20))

đầu ra

Dog is Walking Labrador is barking. 30

Ví dụ nhanh để phá vỡ quy ước

Ví dụ này chỉ để cho bạn thấy rằng không bắt buộc phải sử dụng tên biến là “self” và “cls”. Trong lập trình thực tế, hãy luôn tuân theo quy ước này

________số 8

Biến "bản thân" được liên kết với phiên bản hiện tại

Biến self cho phép chúng ta truy cập vào các thuộc tính của cá thể hiện tại. Chúng ta có thể xác nhận điều này bằng một ví dụ đơn giản bằng cách tạo hai thể hiện khác nhau của lớp Dog

class Dog: def __init__(self, b): self.breed = b def bark(self): print(f'{self.breed} is Barking.') d1 = Dog('Labrador') d2 = Dog('Husky') d1.bark() d2.bark()

đầu ra

class Dog: def bark(): print('Barking') d = Dog() print("Done") 0

Tại sao không ẩn biến "self"?

Đã có rất nhiều đề xuất biến biến “self” thành một từ khóa dành riêng và có sẵn ngầm định cho phương thức cá thể. Tuy nhiên, lời đề nghị đã bị từ chối bởi “Guido van Rossum”. Bạn có thể đọc về chúng ở đây và ở đây

Chủ đề