Tôi thực sự không khuyến khích khởi tạo các biến mà bạn không cần phải luôn luôn trong __init__
cho một giá trị mặc định tùy ý.
Tôi đặt câu hỏi về việc bạn sử dụng OO nếu đây là trường hợp, nhưng tôi chắc chắn có một trường hợp hợp lệ và dễ hiểu trong đó __init__
sẽ không làm mọi thứ và lớp sẽ muốn tự sửa đổi bằng cách thêm các thuộc tính bổ sung với các phương thức khác.
Cách thích hợp theo ý kiến của tôi để kiểm tra xem một biến được đặt trong khi chạy một phương thức có thể muốn sử dụng nó sẽ là sử dụng hasattr
. Đây là trong trường hợp đây là một cách hợp lệ để sử dụng phương pháp và bài kiểm tra chỉ chuyển hành vi theo cách hợp lý.
Một cách khác là thử và sử dụng nó và xử lý ngoại lệ và cung cấp một số thông tin thân thiện với người dùng về những gì người dùng lớp của bạn đang làm sai. Đây là trong trường hợp phương thức cần thuộc tính được đặt trước khi chạy.
tức là hey người đàn ông, bạn đã khởi tạo lớp, nhưng bạn cần đảm bảo thuộc tính z
tồn tại bằng cách gọi phương thức z_init
trước khi chạy phương thức z_run
.
Một cách khác, được cho là cách pythonic hơn, sẽ chỉ là ghi lại cách sử dụng phương pháp trong tài liệu và sau đó để ngoại lệ khi nó được sử dụng không đúng cách. Điều này là đủ tốt cho việc thực hiện một cái gì đó đầu tiên và sau đó bạn có thể tập trung vào nhiệm vụ tiếp theo. Đây là trong cùng một tình huống như trên, phương thức cần thuộc tính được đặt.
Lý do tôi không thích ý tưởng khởi tạo các biến thành mặc định tùy ý là điều này có thể gây nhầm lẫn [vì nó là tùy ý] và là tiếng ồn dòng.
Nếu giá trị không tùy ý và đơn giản là giá trị mặc định có thể thay đổi, bạn nên sử dụng giá trị mặc định trong phương thức __init__
có thể được ghi đè. Nó cũng thực sự có thể là một trạng thái ban đầu hợp lệ, cũng không tùy ý và bạn nên đặt nó theo phương thức __init__
.not arbitrary and simply a default value that can be changed you should be using a default value in the __init__
method that can be overridden. It can also actually be a valid initial state, which is also not arbitrary and you should set it in the __init__
method.
Vì vậy, câu trả lời thực sự là nó phụ thuộc, và có lẽ bạn nên tránh nó và đặt câu hỏi về việc sử dụng OO của bạn nếu bạn đang làm điều này bằng cách thêm các thuộc tính vào các phương thức khác hoặc khởi tạo các thuộc tính vào các giá trị tùy ý.
Trong khi Simeon Visser đang nói để giữ đối tượng của bạn ở trạng thái nhất quán, anh ta không có cơ sở cho sự nhất quán dựa trên ví dụ trừu tượng của bạn. Trong khi Pylint cảnh báo về loại điều này, các cảnh báo từ các chương trình lint chỉ đơn giản là một người đánh giá cấp cao có thể được cảnh báo về những điều thường chỉ ra mùi mã. Tôi nói người đánh giá cấp cao bởi vì một người đánh giá thực sự nên đọc và hiểu tất cả các mã của bạn, và do đó không thực sự cần pylint.
Một ví dụ phá vỡ quy tắc của ngón tay cái:
class Mutant[object]:
"""A mutant!"""
def __init__[self]:
"""A mutant is born with only 1 eye and 1 mouth"""
self.eyes = 1
self.mouth = 1
self.location = 'Montana'
def roll_to[self, location]:
"""If they have limbs, running is less dangerous"""
if hasattr[self, 'limbs']:
print 'Your mutant broke its limbs off!!'
del self.limbs
self.location = location
def run_to[self, location]:
"""If they don't have limbs, running is not effective"""
if not hasattr[self, 'limbs']:
print 'Your mutant tries to run but he has no limbs.'
else:
self.location = location
def grow_limbs[self, number_of_limbs]:
"""Ah, evolution!"""
assert number_of_limbs > 0, 'Cannot grow 0 or less limbs...'
if hasattr[self, 'limbs']:
self.limbs += number_of_limbs
else:
self.limbs = number_of_limbs
Nhiều lớp muốn tạo các đối tượng với các trường hợp được tùy chỉnh theo trạng thái ban đầu cụ thể.Khởi tạo lớp, phương thức
0class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
__init__
là một trong nhiều tên phương pháp có ý nghĩa đặc biệt trong các lớp Python. Chú ý đôi nhấn mạnh cả ở đầu và cuối cùng trong tên.
__init__
là viết tắt để "khởi tạo", do đó, nó còn được gọi là phương thức khởi tạo. Tất cả các lớp nên có một phương thức
class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
3. Khi bạn tạo một đối tượng mới của lớp, Python sẽ tự động gọi class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
3 ngay lập tức để khởi tạo đối tượng mới.initialization method. All classes should have an class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
3 method. When you create a new object of the class, Python automatically calls class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
3 right away to initialize the new object.Trong lớp
class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
5 trước đó, có vẻ như chúng tôi đặt giá trị của đối tượng bằng cách gán các giá trị cho các biến lớp [____ 16] khi xác định lớp. Bất cứ khi nào một đối tượng class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
5 mới được tạo, nó luôn được đặt là class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
8Nhưng trên thực tế, cách tiêu chuẩn để khởi tạo các giá trị của đối tượng khi tạo đối tượng là sử dụng phương thức
9 trong lớp.class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
Hãy viết lại lớp
class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
5 theo cách tiêu chuẩn hơn:class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
Giống như tất cả các phương thức trong một lớp,
class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
3 luôn có ít nhất một đối số [cũng là đối số đầu tiên], __init__
2, trong đó đề cập đến chính đối tượng được tạo.Ở đây trong
class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
3, chúng tôi xác định một biến sử dụng __init__
4 để chỉ ra rằng __init__
5 là biến thể hiện, nó thuộc về một đối tượng.Nếu một lớp xác định phương thức
class Apple:
def __init__[self]
self.color = 'red'
def say[self]:
print["I'm an apple."]
a1 = Apple[] # create an Apple instance, a1
print[a1.color] # red
a1.say[] # I'm an apple
3, khi bạn tạo một thể hiện lớp [một đối tượng], Python sẽ tự động gọi __init__
Function chỉ một lần để khởi tạo các biến của đối tượng.Vì vậy, trong ví dụ này, __init__
8 là một thể hiện Apple mới, khởi tạo, nó có biến __init__
5 và có giá trị ban đầu __init__
0.
__init__
8 cũng có một phương thức __init__
2 có thể in ra thông báo __init__
3