Lớp
>>> attribute = "color"
>>> value = "purple"
4 của chúng ta được cho là chấp nhận bất kỳ số lượng đối số từ khóa nào và gán mỗi đối số đó cho một thuộc tính trên một đối tượng >>> attribute = "color"
>>> value = "purple"
4 mớiChúng ta có thể sử dụng toán tử
>>> attribute = "color"
>>> value = "purple"
6 của Python để nắm bắt các đối số từ khóa tùy ý vào từ điểnclass Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
Nhưng chúng tôi cần một số cách để lưu trữ từng mục trên đối tượng
>>> attribute = "color"
>>> value = "purple"
4 của chúng tôi dưới dạng một mục mớiThông thường thuộc tính sử dụng ký hiệu
>>> attribute = "color"
>>> value = "purple"
8 với ký hiệu >>> attribute = "color"
>>> value = "purple"
9Nhưng chúng tôi không thể sử dụng ký hiệu
>>> attribute = "color"
>>> value = "purple"
9 vì tên thuộc tính của chúng tôi được lưu trữ trong chuỗi. Ví dụ: biến >>> help[setattr]
Help on built-in function setattr in module builtins:
setattr[obj, name, value, /]
Sets the named attribute on the given object to the specified value.
setattr[x, 'y', v] is equivalent to ``x.y = v''
1 có thể chứa chuỗi >>> help[setattr]
Help on built-in function setattr in module builtins:
setattr[obj, name, value, /]
Sets the named attribute on the given object to the specified value.
setattr[x, 'y', v] is equivalent to ``x.y = v''
2 [đại diện cho thuộc tính >>> help[setattr]
Help on built-in function setattr in module builtins:
setattr[obj, name, value, /]
Sets the named attribute on the given object to the specified value.
setattr[x, 'y', v] is equivalent to ``x.y = v''
3 mà chúng tôi muốn gán cho]>>> attribute = "color"
>>> value = "purple"
Và nếu chúng ta thử sử dụng ký hiệu gán thuộc tính thông thường của Python
Chúng ta sẽ kết thúc với thuộc tính có tên là
>>> help[setattr]
Help on built-in function setattr in module builtins:
setattr[obj, name, value, /]
Sets the named attribute on the given object to the specified value.
setattr[x, 'y', v] is equivalent to ``x.y = v''
1 thay vì thuộc tính có tên là >>> help[setattr]
Help on built-in function setattr in module builtins:
setattr[obj, name, value, /]
Sets the named attribute on the given object to the specified value.
setattr[x, 'y', v] is equivalent to ``x.y = v''
3Chúng tôi cần một số cách để gán động một thuộc tính
Chức năng >>> attribute = "color"
>>> value = "purple"
2 tích hợp sẵn của Python để giải cứu
>>> attribute = "color"
>>> value = "purple"
Hàm
>>> attribute = "color"
>>> value = "purple"
2 của Python chấp nhận một đối tượng [đối tượng mà chúng ta đang thêm thuộc tính vào], một chuỗi đại diện cho tên thuộc tính và một giá trị để gán________số 8_______
Vì vậy, gọi hàm
>>> attribute = "color"
>>> value = "purple"
2 như thế này>>> setattr[row, "color", "purple"]
Tương đương với việc gán một thuộc tính như thế này
Chúng tôi có thể sử dụng điều này để triển khai lớp
>>> attribute = "color"
>>> value = "purple"
4 mà chúng tôi đã viết. Chúng ta có thể sử dụng >>> attribute = "color"
>>> value = "purple"
2 cho mỗi thuộc tính mà chúng ta cần gánclass Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
Trong mỗi lần lặp của vòng lặp
>>> setattr[row, "color", "purple"]
1, chúng tôi sẽ gán một thuộc tính mới cho đối tượng >>> attribute = "color"
>>> value = "purple"
4 của mình [hãy nhớ rằng _____18_______3 trỏ tới thể hiện lớp của chúng tôi]. Tên thuộc tính và giá trị đến từ các khóa và giá trị trong từ điển >>> setattr[row, "color", "purple"]
4 [được tạo bởi toán tử >>> attribute = "color"
>>> value = "purple"
6 đó]Bây giờ lớp
>>> attribute = "color"
>>> value = "purple"
4 của chúng tôi có thể lưu trữ các thuộc tính tùy ý, như chúng tôi mong đợi>>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.id
4
Nhưng tại sao lại sử dụng
>>> attribute = "color"
>>> value = "purple"
2? Lớp có [để cung cấp cho chúng chức năng] và [để lưu trữ dữ liệu của chúng]. Các thể hiện của lớp trong Python lưu trữ các thuộc tính của chúng trong một từ điển, được gọi là
>>> setattr[row, "color", "purple"]
8>>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.__dict__
{'id': 4, 'name': 'duck', 'action': 'quack', 'color': 'purple'}
Vì vậy, thay vì sử dụng
>>> attribute = "color"
>>> value = "purple"
2, chúng ta không thể cập nhật trực tiếp từ điển này sao?class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
self.__dict__[attribute] = value
Điều này không làm việc
>>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.name
'duck'
Nhưng không phải lúc nào nó cũng hoạt động
Việc gán thuộc tính sử dụng
>>> setattr[row, "color", "purple"]
8 hầu hết thời gian, nhưng không phải lúc nào cũng vậyMột ví dụ ngược lại là việc sử dụng các thuộc tính trong Python
Thuộc tính
class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
2 của lớp class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
1 này sẽ tạo một thuộc tính class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
2 trên mỗi thể hiện của lớpclass Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
0Nhưng thuộc tính
class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
2 không tồn tại trong từ điển >>> setattr[row, "color", "purple"]
8 trên mỗi trường hợpclass Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
1Sử dụng
>>> attribute = "color"
>>> value = "purple"
2 để gán cho thuộc tính class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
2 của chúng tôi hoạt độngclass Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
2Nhưng việc cập nhật
>>> setattr[row, "color", "purple"]
8 để gán cho thuộc tính class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
2 của chúng tôi không hoạt độngclass Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
3Chúng tôi đã kết thúc với khóa
class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
2 trong >>> setattr[row, "color", "purple"]
8 không tương ứng với giá trị thực của thuộc tính class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
setattr[self, attribute, value]
2 của chúng tôiThuộc tính chỉ là một ví dụ về thuộc tính không tồn tại trong
>>> setattr[row, "color", "purple"]
8. Các lớp sử dụng >>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.id
4
4 thậm chí không có từ điển >>> setattr[row, "color", "purple"]
8class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
4Tại sao không gọi >>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.id
4
6?
>>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.id
4
Hàm
>>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.id
4
7 dựa trên phương thức dunder của >>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.id
4
6. Vậy tại sao không gọi trực tiếp cho >>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.id
4
6?class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
5Điều này không làm việc
class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
6Nhưng đó không phải là cách được đề xuất để đặt thuộc tính. Nhưng. tại sao không?
Gọi ____________6 không được khuyến nghị vì lý do tương tự như không nên gọi trực tiếp các phương thức dunder khác
Khi làm việc với danh sách
class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
7Chúng tôi khuyên bạn nên sử dụng các hàm
>>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.__dict__
{'id': 4, 'name': 'duck', 'action': 'quack', 'color': 'purple'}
1 và >>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.__dict__
{'id': 4, 'name': 'duck', 'action': 'quack', 'color': 'purple'}
2 tích hợp sẵnclass Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
8Thay vì gọi các phương thức dunder
>>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.__dict__
{'id': 4, 'name': 'duck', 'action': 'quack', 'color': 'purple'}
3 và >>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.__dict__
{'id': 4, 'name': 'duck', 'action': 'quack', 'color': 'purple'}
4class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
.. # What should we do now?
9Các phương thức Dunder dùng để truyền tải thông tin tới Python;
Các phương thức Dunder là cách các hoạt động cấp cao hơn trong Python được triển khai. Chúng tôi dự kiến sẽ sử dụng các thao tác cấp cao hơn đó thay vì gọi trực tiếp các phương thức dunder mà chúng tương ứng
Đừng sử dụng >>> attribute = "color"
>>> value = "purple"
2 nếu bạn có thể tránh được
>>> attribute = "color"
>>> value = "purple"
Nếu bạn cần thiết lập động một thuộc tính, thì
>>> attribute = "color"
>>> value = "purple"
2 là cách điển hình nhất để làm như vậy trong PythonNhưng hãy nhớ rằng bạn không nên sử dụng
>>> attribute = "color"
>>> value = "purple"
2 cho bất kỳ phép gán thuộc tính nàoVí dụ: đây là một điều kỳ lạ khi thấy trong Python
>>> setattr[row, "color", "purple"]
Ở đây chúng ta đang tạo một chuỗi
>>> help[setattr]
Help on built-in function setattr in module builtins:
setattr[obj, name, value, /]
Sets the named attribute on the given object to the specified value.
setattr[x, 'y', v] is equivalent to ``x.y = v''
2 và sử dụng nó để gán >>> row = Row[id=4, name="duck", action="quack", color="purple"]
>>> row.__dict__
{'id': 4, 'name': 'duck', 'action': 'quack', 'color': 'purple'}
9 cho thuộc tính >>> help[setattr]
Help on built-in function setattr in module builtins:
setattr[obj, name, value, /]
Sets the named attribute on the given object to the specified value.
setattr[x, 'y', v] is equivalent to ``x.y = v''
3 trên đối tượng class Row:
def __init__[self, **attributes]:
for attribute, value in attributes.items[]:
self.__dict__[attribute] = value
1 của chúng ta thông qua >>> attribute = "color"
>>> value = "purple"
2Chúng tôi đang chỉ định một thuộc tính ở đây, nhưng thuộc tính này không động. chúng tôi biết tên của nó
Thay vào đó, sẽ tốt hơn nếu sử dụng phép gán thuộc tính điển hình
Nếu bạn không cần gán thuộc tính một cách linh hoạt, hãy sử dụng
>>> attribute = "color"
>>> value = "purple"
9 để thực hiện gán thuộc tính cũ đơn giản. Hàm >>> attribute = "color"
>>> value = "purple"
2 tích hợp sẵn của Python dành cho trường hợp hiếm hoi khi việc gán thuộc tính của bạn phải được thực hiện một cách linh hoạtSử dụng hàm >>> attribute = "color"
>>> value = "purple"
2 của Python để gán thuộc tính động
>>> attribute = "color"
>>> value = "purple"
Hàm
>>> attribute = "color"
>>> value = "purple"
2 tích hợp sẵn của Python dùng để gán động các thuộc tínhNếu bạn có một biến có chuỗi đại diện cho tên thuộc tính, thì bạn có thể cần hàm
>>> attribute = "color"
>>> value = "purple"
2 tích hợp>>> attribute = "color"
>>> value = "purple"
1Nhưng hãy nhớ rằng việc thiết lập một thuộc tính động là một việc không bình thường. Nếu bạn biết trước tên thuộc tính [như thường lệ] thì bạn nên sử dụng phép gán thuộc tính thông thường để thay thế