2010-01-19 30 views
23

Trong C# tôi sẽ đi:Làm cách nào để khai báo một thuộc tính bằng Python mà không có giá trị?

string UserName; 
string Password; 

Nhưng bây giờ, bằng Python:

class User: 
    UserName 
    Password 

tôi nhận được một lỗi mà UserName không được định nghĩa. Tôi có thể không khai báo biến không có biến không?

+0

Hướng dẫn Python có tại đây: http://docs.python.org/tutorial/index.html Khá tốt nếu bạn đã lập trình trước đây. –

+1

Tại sao bạn muốn làm điều đó? – sykora

+0

Cụm từ "không có biến" có thể được dự định là "không có giá trị". –

Trả lời

41

Trong Python và nhiều ngôn ngữ khác, có một giá trị có nghĩa là "không có giá trị". Trong Python, giá trị đó là None. Vì vậy, bạn có thể làm một cái gì đó như thế này:

class User: 
    UserName = None 
    PassWord = None 

Những chắc chắn âm thanh như biến dụ mặc dù, và không biến lớp học, như vậy có lẽ làm điều này:

class User(object): 
    def __init__(self): 
     self.UserName = None 
     self.PassWord = None 

Lưu ý cách Python gán giá trị None ngầm từ thời gian gian:

def f(): 
    pass 
g = f() # g now has the value of None 
+0

Xin chào, cảm ơn câu trả lời. Một vài câu hỏi, tại sao bạn đặt (đối tượng) ở cuối tên lớp? Ngoài ra, def là gì __init__? Nếu bạn có một liên kết tốt sẽ tuyệt vời. –

+0

@Sergio Tapia: Xem phần này: http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python –

+0

mở rộng 'đối tượng' trong Python là loại cú pháp cú pháp, mặc dù một điều cực kỳ phổ biến, điều đó có nghĩa là bạn muốn sử dụng các lớp kiểu mới. Nếu sử dụng Python 2.x, bạn sẽ có thói quen làm điều đó. '__init__' là một hàm tạo python. – Triptych

11

Trước hết, bạn nên viết lại như thế này:

class User(object): 
    def __init__(self, username, password): 
    self.username = username 
    self.password = password 

Bằng cách này, tên người dùng và mật khẩu là các biến Ví dụ thay vì các biến lớp (trong ví dụ của bạn, họ là các biến lớp - tất cả các biến Ví dụ cần phải được xác định trong __init__ là thuộc tính của self). Sau đó, bạn có thể khởi tạo User với bất kỳ tên người dùng và mật khẩu nào bạn muốn, bao gồm None nếu bạn thực sự muốn chúng không có giá trị.

+1

Và, nếu bạn nghĩ rằng bạn muốn "tuyên bố" một thuộc tính, bạn không thể. Tuy nhiên, bạn có thể gán 'None' để bạn có thể tạo một thuộc tính. –

2

Chỉ cần gán giá trị của None:

self.username = None

+0

Vâng, bạn nói đúng. Nhưng câu trả lời đã được chọn. –

+0

Nó giúp nói chuyện tích cực. Khi nghi ngờ, hãy chạy thử nghiệm đơn giản nhất để nhận được xác nhận. Bạn có thể (và có thể) tiếp tục nhận được upvotes lâu sau khi một câu trả lời đã được chấp nhận. –

+0

Cảm ơn bạn đã đẩy S.Lott. Tôi đã thử nghiệm nó và cập nhật câu trả lời của tôi. –

5

Bạn không thể. Trong Python, "Biến" chỉ là tên. Một tên luôn luôn điểm ("là ràng buộc") cho một đối tượng. Đó là quy ước để chỉ định tên chưa có giá trị hợp lý, nhưng phải có mặt, đến None.

Bạn cũng có thể quan tâm đến số answer here của mình.

+0

+1. Luôn luôn tốt để nhắc nhở mọi người rằng "gán giá trị" trong Python là một chút của một khái niệm không rõ ràng. – Triptych

5

Trong mã của bạn:

class User: 
    UserName 
    Password 

UserNamePassword được phân tích cú pháp như biểu thức. Vì họ chưa được chỉ định vào thời điểm này, bạn sẽ nhận được NameError.

Trong Python, một biến phải được xác định bằng câu lệnh gán trước khi nó có thể được sử dụng trong một biểu thức, nếu không bạn sẽ nhận được một NameError. Lưu ý rằng "trước" ở đây có nghĩa là "lệnh thực hiện", không phải "lệnh mã nguồn". Có nhiều hơn một chút với nó (các câu lệnh import, globals, hacks namespace), nhưng hãy giữ nó đơn giản ở đây.

Cách thành ngữ để xác định biến "không có giá trị" là gán giá trị None.

Ngoài ra, mã của bạn có vẻ như thực sự muốn các thành viên thể hiện chứ không phải thành viên của lớp học.Cách thành ngữ để làm điều đó, như được công nhận bởi một số công cụ phân tích tĩnh như pylint, là:

class User(object): 
    def __init__(self): 
     self.username = None 
     self.password = None 

Ngoài ra, nó là tốt phong cách Python để lấy được tất cả các lớp từ "đối tượng", vì vậy bạn sử dụng các lớp học kiểu mới và đặt tên biến mẫu bằng quy ước lowercase_with_underscore hoặc initialLowerWithCaps. Kiểu InitialCaps khá phổ biến dành riêng cho các tên lớp.

Các vấn đề liên quan