Hướng dẫn python class variable not defined - biến lớp python không được xác định

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 đó

https://stackoverflow.com/questions/28119489/python-class-variable-accessible-from-class-method

https://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.

Hướng dẫn python class variable not defined - biến lớp python không được xác định
Hiểu các biến 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 School 
3 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ố
    # 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.
  • 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]
0

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.

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]
1

Output::

del connections[self.currentid]
2

Note::

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]
3

Output::

del connections[self.currentid]
4

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

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
    # 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 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
  • 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ưu ý: Chúng ta nên thay đổi giá trị biến lớp chỉ bằng tên lớp.Thí dụ
Đó 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ệnBả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ụ
Biến thể

Example::

Biến lớp

del connections[self.currentid]
5

Output::

del connections[self.currentid]
6

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 đượ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 School 
1.

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]
9

Output::

currentid = global_counter
0

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ụ,

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 School 
9 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

Tại sao Python nói rằng biến của tôi không được xác định?

Kết luận # Python "NameError: Tên không được xác định" xảy ra khi chúng ta cố gắng truy cập một biến hoặc hàm không được xác định hoặc trước khi nó được xác định. Để giải quyết lỗi, hãy đảm bảo bạn chưa viết sai tên của biến và truy cập nó sau khi nó được khai báo.occurs when we try to access a variable or function that is not defined or before it is defined. To solve the error, make sure you haven't misspelled the variable's name and access it after it has been declared.

__ init __ trong Python là gì?

Phương pháp __init__ là tương đương Python của hàm tạo C ++ theo cách tiếp cận hướng đối tượng.Hàm __init__ được gọi mỗi khi một đối tượng được tạo từ một lớp.Phương thức __init__ cho phép lớp khởi tạo các thuộc tính của đối tượng và không phục vụ mục đích nào khác.Nó chỉ được sử dụng trong các lớp học.the Python equivalent of the C++ constructor in an object-oriented approach. The __init__ function is called every time an object is created from a class. The __init__ method lets the class initialize the object's attributes and serves no other purpose. It is only used within classes.

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.. As per the syntax above, a class is defined using the class keyword followed by the class name and : operator after the class name, which allows you to continue in the next indented line to define class members.

Các biến lớp có thể được thay đổi Python không?

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ự.