Bạn không có quyền truy cập ngầm vào các thuộc tính bên trong các phương thức, trong Python.
Một tên trần như
currentid = global_counter
4 trong dòng:del connections[currentid]
Luôn luôn tìm kiếm một cái tên trong phạm vi hàm cục bộ, sau đó trong mỗi phạm vi hàm bao quanh, trước khi thử phạm vi mô-đun toàn cầu [và sau đó xem các bản dựng như là phương sách cuối cùng].
currentid = global_counter
4 là một thuộc tính lớp, sẽ không được tìm thấy trong bất kỳ phạm vi nào trong số đó.Để tìm kiếm một thuộc tính trong Python, bạn luôn cần chỉ định một đối tượng để xem. Mặc dù giao thức tra cứu có nghĩa là đối tượng không nhất thiết phải có thuộc tính; Tra cứu thuộc tính sẽ quay trở lại lớp của đối tượng bạn đã chỉ định [và các lớp cơ sở, nếu có liên quan].always need to specify an object in which to look. Though the lookup protocol means the object need not necessarily have the attribute itself; attribute lookup will fall back to the class of the object you specified [and the base classes, if inheritance is involved].
Vì vậy, điều này sẽ hoạt động:
del connections[self.currentid]
Tuy nhiên, tôi không nghĩ rằng phần còn lại của mã của bạn là làm những gì bạn nghĩ là nó. Dòng này trong phương thức
currentid = global_counter
6:currentid = global_counter
Không đặt thuộc tính
currentid = global_counter
4 của đối tượng currentid = global_counter
8 của bạn. Gán cho một tên trần luôn luôn gán cho một biến cục bộ, trừ khi bạn khai báo rõ ràng nó ____29 [bạn dường như nhận thức được điều này, vì bạn đã sử dụng từ khóa currentid = global_counter
9]. Vì vậy, trong phương pháp currentid = global_counter
6, currentid = global_counter
4 là một biến hàm cục bộ; Giá trị của nó bị mất ở cuối phương pháp currentid = global_counter
6.Trên thực tế, các đối tượng
currentid = global_counter
8 của bạn hoàn toàn không có thuộc tính currentid = global_counter
4 [trừ khi có nhiều mã hơn bạn chưa hiển thị cho chúng tôi]. Đặt self.currentid = global_counter
6 vào khối lớp không cung cấp cho tất cả các phiên bản currentid = global_counter
8 một thuộc tính currentid = global_counter
4. Nó cung cấp cho lớp currentid = global_counter
8 bản thân một thuộc tính currentid = global_counter
4; Đây chỉ giống như khối # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
1 tạo thuộc tính currentid = global_counter
6 [lưu trữ hàm] trên đối tượng lớp, không phải trên mỗi trường hợp riêng lẻ.itself an attribute currentid = global_counter
4; this is just as the # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
1 block creates an currentid = global_counter
6 attribute [storing a function] on the class object, not on each individual instance.Đọc
# cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
3 trong phương thức # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
4 sẽ không tìm thấy thuộc tính currentid = global_counter
4 trong đối tượng # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
6, vì vậy Python sẽ xem xét lớp # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
6 là currentid = global_counter
8. Đối tượng đó có giá trị currentid = global_counter
4, do đó, kết quả của việc đọc # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
3 sẽ là class Student:
# Class variable
school_name = 'ABC School '
def __init__[self, name, roll_no]:
self.name = name
self.roll_no = roll_no
# create first object
s1 = Student['Emma', 10]
print[s1.name, s1.roll_no, Student.school_name]
# access class variable
# create second object
s2 = Student['Jessa', 20]
# access class variable
print[s2.name, s2.roll_no, Student.school_name]
1, cho dù bạn có chạy trước đó currentid = global_counter
6 trước đó trên currentid = global_counter
8 đó hay không.Nếu bạn định lưu trữ
currentid = global_counter
4 dưới dạng biến thể hiện trong mỗi currentid = global_counter
8, thì dòng trong currentid = global_counter
6 sẽ cần phải:self.currentid = global_counter
Điều này gán cho thuộc tính
currentid = global_counter
4 của đối tượng được đề cập bởi # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
6. Sau đó, bạn cũng sẽ cần thay đổi tất cả các tài liệu tham khảo khác thành currentid = global_counter
4 trong các phương thức của bạn thành # cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
3. Các biến lớp không có sẵn trong phạm vi của quá trình tạo lớp, nhưng bạn có thể giải quyết chúng trực tiếp với ClassName.varable
Cũng lưu ý rằng họ tạo các bản sao biến thể hiện theo đó
//stackoverflow.com/questions/28119489/python-class-variable-accessible-from-class-method
//medium.com/python-features/class-vs-instance-variables-8d452e9abcbd
# cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
Bạn có thể xác định lớp học trong Python?
Một lớp trong Python có thể được xác định bằng cách sử dụng từ khóa lớp. Theo cú pháp ở trên, một lớp được xác định bằng cách sử dụng từ khóa lớp theo sau là tên lớp và: toán tử sau tên lớp, cho phép bạn tiếp tục trong dòng thụt lề tiếp theo để xác định các thành viên lớp.
- Các biến lớp có thể được thay đổi Python không?: If the value of a variable varies from object to object, then such variables are called instance variables.
- Chúng ta nên cẩn thận khi thay đổi giá trị của một biến lớp. Nếu chúng ta cố gắng thay đổi biến lớp bằng cách sử dụng một đối tượng, biến thể hiện mới [hoặc không tĩnh] cho đối tượng cụ thể đó sẽ được tạo và biến này, các biến lớp này. Dưới đây là một chương trình Python để chứng minh điều tương tự.: A class variable is a variable that is declared inside of class, but outside of any instance method or
Emma 10 ABC School Jessa 20 ABC School
1 method.
Trong lập trình hướng đối tượng, khi chúng tôi thiết kế một lớp, chúng tôi sử dụng các biến thể hiện và biến lớp.:
- Trong lớp, các thuộc tính có thể được xác định thành hai phần:
- Các biến thể hiện: Nếu giá trị của một biến thay đổi từ đối tượng này sang đối tượng khác, thì các biến đó được gọi là biến thể hiện.
- Các biến lớp: Một biến lớp là một biến được khai báo bên trong lớp, nhưng ngoài bất kỳ phương thức thể hiện nào hoặc & nbsp; ________ 61 & nbsp; phương thức.
- Sau khi đọc bài viết này, bạn sẽ học:
Cách tạo và truy cập các biến lớp
Sửa đổi các giá trị của một biến lớpvalue of a variable is not varied from object to object, such types of variables are called class variables or static variables.
Biến trường hợp so với các biến lớpshared by all instances of a class. Unlike instance variable, the value of a class variable is not varied from object to object,
Trong Python, các biến lớp được khai báo khi một lớp được xây dựng. Chúng không được xác định bên trong bất kỳ phương thức nào của một lớp vì chỉ có một bản sao của biến tĩnh sẽ được tạo và chia sẻ giữa tất cả các đối tượng của lớp.
Ví dụ, trong lớp học sinh, chúng ta có thể có các biến thể hiện khác nhau như tên và số cuộn vì mỗi tên và số cuộn của học sinh là khác nhau.
Nhưng, nếu chúng tôi muốn đưa tên trường vào lớp học sinh, chúng tôi phải sử dụng biến lớp thay vì biến thể hiện vì tên trường giống nhau cho tất cả học sinh. Vì vậy, thay vì duy trì bản sao riêng biệt trong mỗi đối tượng, chúng ta có thể tạo một biến lớp sẽ giữ tên trường để tất cả học sinh [đối tượng] có thể chia sẻ nó.
Chúng tôi có thể thêm bất kỳ số lượng biến lớp trong một lớp.
Tạo các biến lớp
Một biến lớp được khai báo bên trong lớp, nhưng ngoài bất kỳ phương thức thể hiện nào hoặc & nbsp; ________ 61 & nbsp; phương thức.
Theo quy ước, thông thường nó được đặt ngay bên dưới tiêu đề lớp và trước phương thức cấu trúc và các phương thức khác.
Example::
class Student:
# Class variable
school_name = 'ABC School '
def __init__[self, name, roll_no]:
self.name = name
self.roll_no = roll_no
# create first object
s1 = Student['Emma', 10]
print[s1.name, s1.roll_no, Student.school_name]
# access class variable
# create second object
s2 = Student['Jessa', 20]
# access class variable
print[s2.name, s2.roll_no, Student.school_name]
Đầu ra
Emma 10 ABC School Jessa 20 ABC School
Trong ví dụ trên, chúng tôi đã tạo biến lớp
Emma 10 ABC School Jessa 20 ABC School3 và truy cập nó bằng tên đối tượng và tên lớp.
Lưu ý: Giống như các biến thông thường, các biến lớp có thể lưu trữ dữ liệu thuộc bất kỳ loại nào. Chúng ta có thể sử dụng danh sách Python, Tuple Python và Dictiony Python như một biến lớp.: Like regular variables, class variables can store data of any type. We can use Python list, Python tuple, and Python dictionary as a class variable.
Truy cập các biến lớp
Chúng ta có thể truy cập các biến tĩnh bằng tên lớp hoặc theo tham chiếu đối tượng, nhưng nên sử dụng tên lớp.
Trong Python, chúng ta có thể truy cập biến lớp ở những nơi sau
- Truy cập bên trong hàm tạo bằng cách sử dụng tham số
6 hoặc tên lớp.# cat x.py class foo: bar = 999 def baz[self]: self.bar -= 1 return self.bar @classmethod def blurf[cls]: cls.bar += 1 return cls.bar f=foo[] print[f.bar] print[f.baz[]] print[f.baz[]] print[foo.bar] print[foo.blurf[]] print[foo.blurf[]] # python x.py 999 998 1001
- Truy cập biến lớp bên trong Phương thức thể hiện bằng cách sử dụng tên của lớp
- Truy cập từ bên ngoài lớp bằng cách sử dụng tham chiếu đối tượng hoặc tên lớp.
Ví dụ 1: Biến lớp truy cập trong hàm tạo: Access Class Variable in the constructor
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
Đầu ra
ABC School ABC School
Trong ví dụ trên, chúng tôi đã tạo biến lớp Emma 10 ABC School
Jessa 20 ABC School
3 và truy cập nó bằng tên đối tượng và tên lớp.: Access Class Variable in Instance
method and outside class
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name, roll_no]:
self.name = name
self.roll_no = roll_no
# Instance method
def show[self]:
print['Inside instance method']
# access using self
print[self.name, self.roll_no, self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma', 10]
s1.show[]
print['Outside class']
# access class variable outside class
# access using object reference
print[s1.school_name]
# access using class name
print[Student.school_name]
Đầu ra
del connections[self.currentid]
0Trong ví dụ trên, chúng tôi đã tạo biến lớp
Emma 10 ABC School Jessa 20 ABC School3 và truy cập nó bằng tên đối tượng và tên lớp.
Lưu ý: Giống như các biến thông thường, các biến lớp có thể lưu trữ dữ liệu thuộc bất kỳ loại nào. Chúng ta có thể sử dụng danh sách Python, Tuple Python và Dictiony Python như một biến lớp.
Truy cập các biến lớp
Chúng ta có thể truy cập các biến tĩnh bằng tên lớp hoặc theo tham chiếu đối tượng, nhưng nên sử dụng tên lớp.: We should change the class variable’s value using the class name only.
Trong Python, chúng ta có thể truy cập biến lớp ở những nơi sau
del connections[self.currentid]
1Output::
del connections[self.currentid]
2Note::
Truy cập bên trong hàm tạo bằng cách sử dụng tham số
# cat x.py
class foo:
bar = 999
def baz[self]:
self.bar -= 1
return self.bar
@classmethod
def blurf[cls]:
cls.bar += 1
return cls.bar
f=foo[]
print[f.bar]
print[f.baz[]]
print[f.baz[]]
print[foo.bar]
print[foo.blurf[]]
print[foo.blurf[]]
# python x.py
999
998
1001
6 hoặc tên lớp.Example::
del connections[self.currentid]
3Output::
del connections[self.currentid]
4Truy cập biến lớp bên trong Phương thức thể hiện bằng cách sử dụng tên của lớp
Truy cập từ bên ngoài lớp bằng cách sử dụng tham chiếu đối tượng hoặc tên lớp.
Ví dụ 1: Biến lớp truy cập trong hàm tạo
Ví dụ 2: Biến lớp truy cập trong phương thức ví dụ và lớp bên ngoài
- Trong ví dụ này, chúng tôi đã truy cập biến lớp
Emma 10 ABC School Jessa 20 ABC School
3 bằng tên lớp và từ khóa
6 bên trong một phương thức.: Instance variable’s value varies from object to object. Instance variables are not shared by objects. Every object has its own copy of the instance attribute# cat x.py class foo: bar = 999 def baz[self]: self.bar -= 1 return self.bar @classmethod def blurf[cls]: cls.bar += 1 return cls.bar f=foo[] print[f.bar] print[f.baz[]] print[f.baz[]] print[foo.bar] print[foo.blurf[]] print[foo.blurf[]] # python x.py 999 998 1001
- Sửa đổi các biến lớp: A class variable is a variable that is declared inside of class, but outside of any instance method or
Emma 10 ABC School Jessa 20 ABC School
1 method. Class variables are shared by all instances of a class.
Nói chung, chúng tôi gán giá trị cho một biến lớp bên trong khai báo lớp. Tuy nhiên, chúng ta có thể thay đổi giá trị của biến lớp trong lớp hoặc bên ngoài lớp.: Instance variables in Python with Examples
Đó là thực tiễn tốt nhất để sử dụng tên lớp để thay đổi giá trị của biến lớp. Bởi vì nếu chúng ta cố gắng thay đổi giá trị biến lớp của lớp bằng cách sử dụng một đối tượng, một biến thể hiện mới được tạo cho đối tượng cụ thể đó, trong đó làm mờ các biến lớp. | Một biến thể hiện mới được tạo cho đối tượng S1 và biến này làm mờ các biến lớp. Vì vậy, luôn luôn sử dụng tên lớp để sửa đổi biến lớp. |
Biến lớp so với biến thể hiện | Bảng sau đây cho thấy sự khác biệt giữa biến thể hiện và biến lớp. |
Trong Python, các thuộc tính có thể được xác định thành hai phần: | Các biến thể hiện: Giá trị biến thể thay đổi từ đối tượng này sang đối tượng khác. Các biến thể hiện không được chia sẻ bởi các đối tượng. Mỗi đối tượng đều có bản sao riêng của thuộc tính thể hiện |
Các biến lớp: Một biến lớp là một biến được khai báo bên trong lớp, nhưng ngoài bất kỳ phương thức thể hiện nào hoặc & nbsp; ________ 61 & nbsp; phương thức. Các biến lớp được chia sẻ bởi tất cả các trường hợp của một lớp. | Đọc thêm: Các biến thể hiện trong Python với các ví dụ |
Example::
Biến lớp
del connections[self.currentid]
5Output::
del connections[self.currentid]
6Các biến thể hiện không được chia sẻ bởi các đối tượng. Mỗi đối tượng đều có bản sao riêng của thuộc tính thể hiện
Các biến lớp được chia sẻ bởi tất cả các trường hợp.
Các biến thể hiện được khai báo bên trong hàm tạo, tức là phương thức
Emma 10 ABC School Jessa 20 ABC School1.
Chúng ta có thể sử dụng tên lớp cha hoặc lớp con để thay đổi giá trị của biến lớp lớp cha trong lớp con.
Thí dụ
del connections[self.currentid]
7Đầu ra
del connections[self.currentid]
8Điều gì sẽ xảy ra nếu cả lớp con và lớp cha có cùng tên biến lớp. Trong trường hợp này, lớp con sẽ không kế thừa biến lớp của lớp cơ sở. Vì vậy, nên tạo một biến lớp riêng cho lớp con thay vì kế thừa biến lớp cơ sở.child class and parent class has the same class variable name. In this case, the child class will not inherit the class variable of a base class. So it is recommended to create a separate class variable for child class instead of inheriting the base class variable.
Example::
del connections[self.currentid]
9Output::
currentid = global_counter
0Sử dụng sai các biến lớp
Trong Python, chúng ta nên sử dụng đúng biến lớp vì tất cả các đối tượng chia sẻ cùng một bản sao. Do đó, nếu một trong các đối tượng sửa đổi giá trị của biến lớp, thì tất cả các đối tượng bắt đầu đề cập đến bản sao mới.
Ví dụ,
Thí dụ
currentid = global_counter
1Đầu ra
currentid = global_counter
2Điều gì sẽ xảy ra nếu cả lớp con và lớp cha có cùng tên biến lớp. Trong trường hợp này, lớp con sẽ không kế thừa biến lớp của lớp cơ sở. Vì vậy, nên tạo một biến lớp riêng cho lớp con thay vì kế thừa biến lớp cơ sở.
Sử dụng sai các biến lớp
Trong Python, chúng ta nên sử dụng đúng biến lớp vì tất cả các đối tượng chia sẻ cùng một bản sao. Do đó, nếu một trong các đối tượng sửa đổi giá trị của biến lớp, thì tất cả các đối tượng bắt đầu đề cập đến bản sao mới.
Ví dụ,
Trong ví dụ trên, biến thể hiện
Emma 10 ABC School Jessa 20 ABC School9 là duy nhất cho mỗi người chơi. Biến lớp
class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
0 và class Student:
# Class variable
school_name = 'ABC School '
# constructor
def __init__[self, name]:
self.name = name
# access class variable inside constructor using self
print[self.school_name]
# access using class name
print[Student.school_name]
# create Object
s1 = Student['Emma']
1 có thể được truy cập và sửa đổi bởi bất kỳ đối tượng nào.currentid = global_counter
3