Hàm tạo của lớp python làm đối số

Có thể hơi cồng kềnh khi sử dụng các phương thức hoặc phép gán để đặt tất cả các biến thể hiện thành các giá trị ban đầu mong muốn sau khi một đối tượng mới được tạo. Thay vào đó, người ta muốn chuyển các giá trị ban đầu cho hàm tạo và lấy lại một đối tượng có các giá trị này cho các biến thể hiện. Có thể làm như vậy trong Python bằng cách thêm các tham số bổ sung vào hàm tạo. Hãy tiếp tục và thay đổi định nghĩa của hàm tạo trong lớp Car thành phiên bản sau

def __init__[self, owner = 'UNKNOWN', color = 'UNKNOWN', currentSpeed = 0, lightsOn = False]: 
	self.owner = owner 
	self.color = color 
	self.currentSpeed = currentSpeed 
	self.lightsOn = lightsOn
    

Xin lưu ý rằng ở đây chúng tôi đã sử dụng các tên giống hệt nhau cho các biến thể hiện và các tham số tương ứng của hàm tạo được sử dụng để cung cấp các giá trị ban đầu. Tuy nhiên, chúng vẫn có thể phân biệt được vì các biến thể hiện luôn có tiền tố “self. ”. Trong phiên bản mới này của hàm tạo, chúng tôi đang sử dụng các đối số từ khóa cho từng thuộc tính để cung cấp tính linh hoạt tối đa cho người dùng của lớp. Giờ đây, người dùng có thể sử dụng bất kỳ kết hợp nào trong việc cung cấp các giá trị ban đầu của riêng họ hoặc sử dụng các giá trị mặc định cho các thuộc tính này. Đây là cách tạo lại xe của Sue bằng cách cung cấp các giá trị cho tất cả các thuộc tính

carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
Output: 

Car with owner = Sue, color = white, currentSpeed = 41, lightsOn = True

Đây là phiên bản mà chúng tôi chỉ chỉ định chủ sở hữu và tốc độ. Chắc chắn bạn có thể đoán đầu ra sẽ như thế nào

carOfSue = Car[owner='Sue', currentSpeed = 41] 
carOfSue.printInfo[] 

Ngoài __init__[…] cho hàm tạo, còn có một phương thức đặc biệt khác gọi là __str__[]. Phương thức này được Python gọi khi bạn chuyển đổi rõ ràng một đối tượng từ lớp đó thành một chuỗi bằng cách sử dụng hàm str[…] của Python hoặc ngầm định, e. g. khi in ra đối tượng với print[…]. Hãy thử hai lệnh sau cho ô tô của Sue và xem kết quả bạn nhận được

print[str[carOfSue]] 
print[carOfSue]

Bây giờ thêm phương thức sau vào định nghĩa của lớp Car

	def __str__[self]: 
            return 'Car with owner = {0}, color = {1}, currentSpeed = {2}, lightsOn = {3}'.format[self.owner, self.color, self.currentSpeed, self.lightsOn]

Bây giờ lặp lại hai lệnh từ trên và xem sự khác biệt. Đầu ra bây giờ sẽ là dòng sau được lặp lại hai lần

Car with owner = Sue, color = UNKNOWN, currentSpeed = 41, lightsOn = False

Để triển khai phương thức, chúng tôi chỉ cần sử dụng cùng một chuỗi mà chúng tôi đã in ra từ phương thức printInfo[]. Về nguyên tắc, phương thức này bây giờ không thực sự cần thiết nữa và có thể bị xóa khỏi định nghĩa lớp

Các đối tượng có thể được sử dụng như bất kỳ giá trị nào khác trong mã Python. Trên thực tế, mọi thứ trong Python đều là một đối tượng, ngay cả các kiểu dữ liệu nguyên thủy như số và giá trị Boolean. Điều đó có nghĩa là chúng ta có thể…

  • sử dụng các đối tượng làm tham số của các hàm và phương thức [bạn sẽ thấy một ví dụ về điều này với hàm stopCar[…] được định nghĩa bên dưới],
  • trả về các đối tượng dưới dạng giá trị trả về của hàm hoặc phương thức,
  • lưu trữ các đối tượng bên trong các chuỗi hoặc vùng chứa, ví dụ như trong các danh sách như thế này. carList = [ carOfTom, carOfSue, Car[owner = 'Mike'],
  • lưu trữ các đối tượng trong các biến thể hiện của các đối tượng khác

Để minh họa điểm cuối cùng này, chúng ta có thể thêm một lớp khác vào ví dụ ô tô của mình, một lớp đại diện cho các nhà sản xuất ô tô

class Manufacturer[]: 
     def __init__[self, name]: 
          self.name = name

Thông thường, một lớp như vậy sẽ phức tạp hơn nhiều, chứa các thuộc tính bổ sung để mô tả một nhà sản xuất ô tô cụ thể. Nhưng chúng tôi giữ mọi thứ rất đơn giản ở đây và nói rằng tài sản duy nhất là tên của nhà sản xuất. Bây giờ chúng ta sửa đổi phần đầu của định nghĩa của lớp Car để một biến thực thể khác được tạo có tên là self. nhà chế tạo. Điều này được sử dụng để lưu trữ một đối tượng của lớp Nhà sản xuất bên trong mỗi đối tượng Xe hơi để đại diện cho nhà sản xuất chiếc xe cụ thể đó. Đối với các tham số là đối tượng của các lớp, thông thường sử dụng giá trị đặc biệt Không có làm giá trị mặc định khi tham số không được cung cấp

________số 8

Phần còn lại của định nghĩa lớp có thể giữ nguyên mặc dù chúng ta thường thay đổi __str__[. ] để bao gồm biến thể hiện mới này. Đoạn mã sau cho biết cách tạo đối tượng Xe hơi mới bằng cách tạo đối tượng Nhà sản xuất có tên 'Chrysler' trước tiên. Đối tượng này cũng có thể đến từ danh sách hoặc từ điển các đối tượng nhà sản xuất ô tô được xác định trước nếu chúng ta muốn có thể sử dụng cùng một đối tượng Nhà sản xuất cho một số ô tô. Sau đó, chúng tôi sử dụng đối tượng này cho đối số từ khóa nhà sản xuất của hàm tạo Ô tô. Kết quả là, đối tượng này được gán cho biến thể hiện của nhà sản xuất ô tô như được phản ánh bởi đầu ra từ câu lệnh in cuối cùng

m = Manufacturer['Chrysler'] 
carOfFrank = Car[manufacturer = m, owner = 'Frank', currentSpeed = 70] 
print[carOfFrank.manufacturer.name]
carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
0

Lưu ý rằng trong dòng cuối cùng của ví dụ trên, chúng ta xâu chuỗi mọi thứ lại với nhau thông qua các dấu chấm bắt đầu từ biến chứa đối tượng xe hơi [carOfFrank], theo sau là tên của một biến thực thể [nhà sản xuất] của lớp Xe hơi, tiếp theo là tên của một . XeCủaFrank. nhà chế tạo. Tên. Đây cũng là điều bạn có thể đã thấy trước đây, chẳng hạn như “describeObject. Mối liên hệ không gian. Tên” khi truy cập tên của đối tượng tham chiếu không gian được lưu trữ bên trong một đối tượng Mô tả phức tạp

Chúng tôi đã thảo luận ngắn gọn trong Phần 4. 2 khi nói về các tập hợp mà khi định nghĩa các lớp của riêng chúng ta, chúng ta có thể phải cung cấp các định nghĩa về các toán tử so sánh như == và < để chúng hoạt động như chúng ta mong muốn khi được đặt vào một tập hợp. Vì vậy, một câu hỏi chẳng hạn sẽ là, khi nào thì hai đối tượng ô tô được coi là bằng nhau? . Hoặc có thể hợp lý đối với một ứng dụng cụ thể để xác định rằng hai đối tượng Xe hơi bằng nhau nếu tên của chủ sở hữu và nhà sản xuất bằng nhau. Nếu các biến thể hiện của chúng tôi sẽ bao gồm biển số xe thì rõ ràng sẽ tạo ra một tiêu chí tốt hơn nhiều. Tương tự, giả sử chúng ta muốn giữ các đối tượng Xe hơi của mình trong hàng đợi ưu tiên được sắp xếp theo giá trị tốc độ hiện tại của chúng. Trong trường hợp đó, chúng ta cần xác định < toán tử so sánh để xe A < xe B đúng nếu giá trị của biến tốc độ hiện tại của A nhỏ hơn giá trị của B

Ý nghĩa của toán tử == được xác định thông qua một phương thức đặc biệt gọi là __eq__[…] cho “bằng”, trong khi ý nghĩa của toán tử < được xác định trong một phương thức đặc biệt có tên __lt__[…] cho “nhỏ hơn”. Ví dụ mã sau đây mở rộng phiên bản mới nhất của lớp Xe hơi của chúng tôi với định nghĩa về phương thức __eq__[…] dựa trên ý tưởng rằng ô tô nên được coi là bình đẳng nếu chủ sở hữu và nhà sản xuất bình đẳng. Sau đó, nó sử dụng danh sách Python với một đối tượng ô tô và một đối tượng ô tô khác có cùng chủ sở hữu và nhà sản xuất nhưng tốc độ khác nhau để minh họa rằng định nghĩa mới hoạt động như dự định cho các thao tác danh sách “trong” và chỉ mục […]

carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
1
carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
2

Lưu ý rằng __eq__[…] lấy một đối tượng Car khác làm tham số và sau đó chỉ cần so sánh các giá trị của các biến đối tượng chủ sở hữu và nhà sản xuất của đối tượng Car mà phương thức được gọi với các giá trị tương ứng của đối tượng Car khác đó. Đầu ra cho thấy Python coi ô tô đã được định vị trong danh sách là phần tử đầu tiên, mặc dù đây thực sự là hai đối tượng ô tô khác nhau với các giá trị tốc độ khác nhau. Điều này là do các thao tác này sử dụng định nghĩa mới của toán tử == cho các đối tượng của lớp Car mà chúng ta đã cung cấp với phương thức __eq__[. ]

Bây giờ bạn đã biết những kiến ​​thức cơ bản về cách viết các lớp riêng trong Python và cách khởi tạo chúng cũng như sử dụng các đối tượng đã tạo. Để kết thúc phần này, chúng ta hãy quay lại chủ đề mà chúng ta đã thảo luận trong Phần 1. 4 của Bài 1. Bạn có nhớ sự khác biệt giữa các đối tượng có thể thay đổi và không thể thay đổi khi được cung cấp làm tham số cho các hàm không? . Tất cả các đối tượng mà chúng tôi tạo từ các lớp cũng có thể thay đổi, vì vậy về nguyên tắc bạn có thể viết mã như thế này

carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
3

Khi dừng xe[. ] được gọi, tham số car sẽ đề cập đến cùng một đối tượng car mà biến carOfFrank đang đề cập đến. Do đó, tất cả các thay đổi được thực hiện đối với đối tượng đó bên trong hàm tham chiếu đến biến car sẽ được phản ánh bằng câu lệnh in cuối cùng cho carOfFrank hiển thị tốc độ bằng 0. Điều mà chúng ta chưa thảo luận cho đến giờ là có một tình huống thứ hai mà điều này quan trọng, đó là khi thực hiện một nhiệm vụ. Bạn có thể nghĩ rằng khi bạn viết một cái gì đó như

carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
4

một biến mới sẽ được tạo và một bản sao của đối tượng xe trong biến carOfFrank sẽ được gán cho biến đó để bạn có thể thay đổi các biến thể hiện của đối tượng đó mà không cần thay đổi đối tượng trong carOfFrank. Tuy nhiên, đó chỉ là cách nó hoạt động đối với các giá trị bất biến. Thay vào đó, sau khi gán, cả hai biến sẽ tham chiếu đến cùng một đối tượng Car trong bộ nhớ. Do đó, khi bạn thêm các lệnh sau

carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
5

đầu ra sẽ là

carOfSue = Car[owner='Sue', color='white', currentSpeed = 41, lightsOn = True] 
carOfSue.printInfo[]
6

Nó hoạt động theo cùng một cách đối với tất cả các đối tượng có thể thay đổi, ví dụ như đối với các danh sách. Nếu bạn muốn tạo một bản sao độc lập của một đối tượng có thể thay đổi, mô-đun copy từ thư viện chuẩn Python chứa các hàm copy[…] và deepcopy[…] để tạo các bản sao một cách rõ ràng. Sự khác biệt giữa hai chức năng được giải thích trong tài liệu và chỉ đóng vai trò khi đối tượng được sao chép chứa các đối tượng khác, e. g. nếu bạn muốn tạo một bản sao của danh sách các đối tượng Xe hơi

Bạn có thể chuyển một lớp làm đối số trong Python không?

vâng, bạn có thể vượt qua các lớp hoặc chức năng hoặc thậm chí các mô-đun . chắc chắn foo[]. pass vào đây nó cho địa chỉ ex. hàm foo at0x024E4463 có nghĩa là nó được cung cấp địa chỉ của hàm foo nhưng trong lớp nó không có nghĩa là lớp foo. pass vào đây nó cho

Hàm tạo có thể có đối số mặc định Python không?

Có thể có hàm tạo với các đối số mặc định . Điều đó có nghĩa là nếu hàm tạo được định nghĩa với n tham số, chúng ta có thể gọi nó với ít hơn n đối số được chỉ định trong lệnh gọi. Tên bất kỳ [ para1,para2,para3,para4 =val4, … paran = valn];

Một đối tượng có thể được truyền dưới dạng đối số Python không?

Một hàm có thể nhận nhiều đối số, các đối số này có thể là đối tượng, biến [cùng hoặc khác kiểu dữ liệu] và hàm .

__ str __ trong Python là gì?

Trăn __str__[] . Phương thức này được gọi khi hàm print[] hoặc str[] được gọi trên một đối tượng. Phương thức này phải trả về đối tượng String. This method returns the string representation of the object. This method is called when print[] or str[] function is invoked on an object. This method must return the String object.

Chủ Đề