Chuyển nhượng có nghĩa là "tên này ở phía bên trái hiện đề cập đến kết quả đánh giá phía bên phải, bất kể nó được gọi là gì trước đó [nếu có]"
foo = 'bar' # the name 'foo' is now a name for the string 'bar'
foo = 2 * 3 # the name 'foo' stops being a name for the string 'bar',
# and starts being a name for the integer 6, resulting from the multiplication
Như vậy, tên của Python [một thuật ngữ tốt hơn so với "biến", được cho là] không có các loại liên quan; . Bạn có thể áp dụng lại cùng một tên cho bất kỳ thứ gì bất kể loại của nó, nhưng thứ đó vẫn có hành vi phụ thuộc vào loại của nó. Tên chỉ đơn giản là một cách để chỉ giá trị [đối tượng]. Điều này trả lời câu hỏi thứ hai của bạn. Bạn không tạo biến để giữ loại tùy chỉnh. Bạn không tạo các biến để giữ bất kỳ loại cụ thể nào. Bạn hoàn toàn không "tạo" các biến. Bạn đặt tên cho các đối tượng
Điểm thứ hai. Python tuân theo một quy tắc rất đơn giản khi nói đến các lớp, điều đó thực sự nhất quán hơn nhiều so với những ngôn ngữ như Java, C++ và C#. mọi thứ được khai báo bên trong khối
class Example:
data = 42
def method[self]: pass
9 là một phần của lớp. Vì vậy, các hàm [class Example:
data = 42
def method[self]: pass
0] được viết ở đây là các phương thức, tôi. e. một phần của đối tượng lớp [không được lưu trữ trên cơ sở từng trường hợp], giống như trong Java, C++ và C#; . Một lần nữa, tên chỉ là tên và chúng không có kiểu liên kết và hàm cũng là đối tượng trong Python. Như vậyclass Example:
data = 42
def method[self]: pass
Lớp cũng là đối tượng trong Python
Vì vậy, bây giờ chúng tôi đã tạo một đối tượng có tên là
class Example:
data = 42
def method[self]: pass
1, đại diện cho lớp của tất cả những thứ là class Example:
data = 42
def method[self]: pass
1. Đối tượng này có hai thuộc tính do người dùng cung cấp [Trong C++ là "thành viên"; trong C# là "trường hoặc thuộc tính hoặc phương thức"; trong Java là "trường hoặc phương thức"]. Một trong số chúng được đặt tên là class Example:
data = 42
def method[self]: pass
0 và nó lưu trữ giá trị số nguyên class Example:
data = 42
def method[self]: pass
1. Cái còn lại có tên là class Example:
data = 42
def method[self]: pass
2 và nó lưu trữ một đối tượng hàm. [Có một số thuộc tính nữa mà Python tự động thêm vào. ]Tuy nhiên, những thuộc tính này vẫn không thực sự là một phần của đối tượng. Về cơ bản, một đối tượng chỉ là một tập hợp nhiều tên hơn [tên thuộc tính], cho đến khi bạn nhận ra những thứ không thể phân chia được nữa. Do đó, các giá trị có thể được chia sẻ giữa các thể hiện khác nhau của một lớp hoặc thậm chí giữa các đối tượng của các lớp khác nhau, nếu bạn cố ý thiết lập điều đó
Hãy tạo một ví dụ
x = Example[]
Bây giờ chúng ta có một đối tượng riêng tên là
class Example:
data = 42
def method[self]: pass
3, là một thể hiện của class Example:
data = 42
def method[self]: pass
1. class Example:
data = 42
def method[self]: pass
0 và class Example:
data = 42
def method[self]: pass
2 không thực sự là một phần của đối tượng, nhưng chúng ta vẫn có thể tra cứu chúng qua class Example:
data = 42
def method[self]: pass
3 nhờ một số phép thuật mà Python thực hiện ở hậu trường. Cụ thể, khi chúng tôi tra cứu class Example:
data = 42
def method[self]: pass
2, chúng tôi sẽ nhận được một "phương thức ràng buộc" [khi chúng tôi gọi nó, class Example:
data = 42
def method[self]: pass
3 được chuyển tự động dưới dạng tham số x = Example[]
0, điều này không thể xảy ra nếu chúng tôi tra cứu trực tiếp x = Example[]
1]Điều gì xảy ra khi chúng tôi cố gắng sử dụng
x = Example[]
2?Khi chúng tôi kiểm tra nó, nó được tìm kiếm trong đối tượng đầu tiên. Nếu không tìm thấy trong đối tượng, Python sẽ tìm trong lớp
Tuy nhiên khi chúng ta gán cho
x = Example[]
2 thì Python sẽ tạo một thuộc tính trên đối tượng. Nó sẽ không thay thế thuộc tính của lớpĐiều này cho phép chúng ta khởi tạo đối tượng. Python sẽ tự động gọi phương thức
x = Example[]
4 của lớp trên các phiên bản mới khi chúng được tạo, nếu có. Trong phương thức này, chúng ta có thể chỉ cần gán cho các thuộc tính để đặt giá trị ban đầu cho thuộc tính đó trên mỗi đối tượngclass Example:
data = 42
def method[self]: pass
7Bây giờ chúng ta phải chỉ định một
x = Example[]
5 khi chúng ta tạo một class Example:
data = 42
def method[self]: pass
1 và mỗi phiên bản có một x = Example[]
5 riêng. Python sẽ bỏ qua thuộc tính lớp x = Example[]
8 bất cứ khi nào chúng ta tra cứu x = Example[]
9 của một thể hiện, bởi vì thuộc tính của thể hiện sẽ được tìm thấy đầu tiênMột cảnh báo cuối cùng. sửa đổi [đột biến] và chuyển nhượng là những thứ khác nhau
Trong Python, các chuỗi là bất biến. Chúng không thể được sửa đổi. khi bạn làm
class Example:
data = 42
def method[self]: pass
2Bạn không thay đổi chuỗi 'hi' ban đầu. Điều đó là không thể trong Python. Thay vào đó, bạn tạo một chuỗi mới
class Example:
data = 42
def method[self]: pass
70 và làm cho class Example:
data = 42
def method[self]: pass
71 không còn là tên của class Example:
data = 42
def method[self]: pass
72 nữa mà thay vào đó bắt đầu là tên của class Example:
data = 42
def method[self]: pass
70. Chúng tôi cũng đã đặt tên class Example:
data = 42
def method[self]: pass
74 cho class Example:
data = 42
def method[self]: pass
72 và sau khi áp dụng lại tên class Example:
data = 42
def method[self]: pass
71, class Example:
data = 42
def method[self]: pass
74 vẫn là tên cho class Example:
data = 42
def method[self]: pass
72, vì class Example:
data = 42
def method[self]: pass
72 vẫn tồn tại và không bị thay đổiNhưng danh sách có thể được thay đổi
class Example:
data = 42
def method[self]: pass
3Bây giờ
class Example:
data = 42
def method[self]: pass
74 cũng là [1, 2, 3, 4], bởi vì chúng tôi đã đặt tên cho class Example:
data = 42
def method[self]: pass
74 cho cùng một thứ mà class Example:
data = 42
def method[self]: pass
71 đã đặt tên, và sau đó chúng tôi đã thay đổi thứ đó. Chúng tôi đã không tạo một danh sách mới cho class Example:
data = 42
def method[self]: pass
71 để đặt tên, bởi vì Python chỉ đơn giản là đối xử khác với class Example:
data = 42
def method[self]: pass
24 đối với các danh sáchĐiều này quan trọng đối với các đối tượng vì nếu bạn có một danh sách dưới dạng thuộc tính lớp và sử dụng một thể hiện để sửa đổi danh sách, thì thay đổi đó sẽ được "nhìn thấy" trong tất cả các thể hiện khác. Điều này là do [a] dữ liệu thực sự là một phần của đối tượng lớp chứ không phải bất kỳ đối tượng thể hiện nào;