Câu trả lời, trong một vài từ
Trong ví dụ của bạn, itsProblem
là một biến cục bộ.
Bạn phải sử dụng self
để đặt và lấy các biến phiên bản. Bạn có thể đặt nó trong __init__
phương thức. Sau đó, mã của bạn sẽ là:
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Nhưng nếu bạn muốn một biến lớp đúng, thì hãy sử dụng trực tiếp tên lớp:
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)
Nhưng hãy cẩn thận với biến này, vì theExample.itsProblem
nó được đặt tự động bằng Example.itsProblem
, nhưng không phải là cùng một biến và có thể thay đổi độc lập.
Một số giải thích
Trong Python, các biến có thể được tạo động. Do đó, bạn có thể làm như sau:
class Example(object):
pass
Example.itsProblem = "problem"
e = Example()
e.itsSecondProblem = "problem"
print Example.itsProblem == e.itsSecondProblem
bản in
Thật
Do đó, đó chính xác là những gì bạn làm với các ví dụ trước.
Thật vậy, trong Python, chúng tôi sử dụng self
as this
, nhưng nó nhiều hơn thế một chút. self
là đối số đầu tiên của bất kỳ phương thức đối tượng nào vì đối số đầu tiên luôn là tham chiếu đối tượng. Điều này là tự động, cho dù bạn có gọi self
hay không.
Có nghĩa là bạn có thể làm:
class Example(object):
def __init__(self):
self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
hoặc là:
class Example(object):
def __init__(my_super_self):
my_super_self.itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Nó giống hệt nhau. Đối số đầu tiên của phương thức đối tượng BẤT KỲ là đối tượng hiện tại, chúng ta chỉ gọi nó self
như một quy ước. Và bạn chỉ thêm một biến vào đối tượng này, giống như cách bạn làm từ bên ngoài.
Bây giờ, về các biến lớp.
Khi bạn làm:
class Example(object):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Bạn sẽ nhận thấy trước tiên chúng tôi đặt một biến lớp , sau đó chúng tôi truy cập một biến đối tượng (cá thể) . Chúng tôi không bao giờ đặt biến đối tượng này nhưng nó hoạt động, làm thế nào điều đó có thể?
Vâng, Python cố gắng lấy biến đối tượng đầu tiên, nhưng nếu nó không thể tìm thấy nó, nó sẽ cung cấp cho bạn biến lớp. Cảnh báo: biến lớp được chia sẻ giữa các phiên bản và biến đối tượng thì không.
Như một kết luận, không bao giờ sử dụng các biến lớp để đặt giá trị mặc định cho các biến đối tượng. Sử dụng __init__
cho điều đó.
Cuối cùng, bạn sẽ biết rằng các lớp Python là các thể hiện và do đó là các đối tượng của chính nó, điều này mang lại cái nhìn sâu sắc mới để hiểu những điều trên. Hãy quay lại và đọc lại điều này sau khi bạn nhận ra điều đó.