Có bất kỳ lối tắt nào để xác định một đối tượng trống trong Python hay bạn luôn phải tạo một cá thể của một lớp trống tùy chỉnh?Tạo một đối tượng trống trong Python
Chỉnh sửa: Tôi có nghĩa là một đối tượng trống có thể sử dụng để nhập vịt.
Có bất kỳ lối tắt nào để xác định một đối tượng trống trong Python hay bạn luôn phải tạo một cá thể của một lớp trống tùy chỉnh?Tạo một đối tượng trống trong Python
Chỉnh sửa: Tôi có nghĩa là một đối tượng trống có thể sử dụng để nhập vịt.
Bạn có thể sử dụng loại để tạo lớp mới khi đang bay và sau đó tạo nhanh lớp đó. Giống như vậy:
>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>
Đối số cần nhập là: Tên lớp, một bộ lớp cơ sở và từ điển của đối tượng. Có thể chứa các hàm (các phương thức của đối tượng) hoặc các thuộc tính.
Bạn thực sự có thể rút ngắn dòng đầu tiên để
>>> t = type('test',(), {})()
>>> t.__class__.__bases__
(object,)
Bởi vì theo loại mặc định tạo ra các lớp học kiểu mới mà kế thừa từ đối tượng.
type
được sử dụng bằng Python cho metaprogramming.
Nhưng nếu bạn chỉ muốn tạo một đối tượng của đối tượng. Sau đó, chỉ cần tạo một thể hiện của nó. Giống như lejlot gợi ý.
Tạo một thể hiện của một lớp mới như thế này có sự khác biệt quan trọng có thể hữu ích.
>>> a = object()
>>> a.whoops = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'whoops'
Trong trường hợp như:
>>> b = type('',(), {})()
>>> b.this_works = 'cool'
>>>
Bạn có ý nghĩa gì với "đối tượng trống"? Ví dụ của lớp object
? Bạn chỉ có thể chạy
a = object()
hoặc có thể bạn muốn khởi tạo tham chiếu null? Sau đó, bạn có thể sử dụng
a = None
Tôi tự hỏi những gì các OP sẽ có thể làm với ' 'a'' định nghĩa hoặc là' 'đối tượng()' 'hoặc'' None'' bởi vì trong trường hợp này , '' a'' không có không gian tên '' __dict__'' và không có thuộc tính nào có thể được thêm vào '' a'' như thế, ví dụ '' ax = 10''. – eyquem
Một đơn giản, ít đáng sợ nhìn chiều để tạo ra một sản phẩm nào (-ish) đối tượng là khai thác thực tế là chức năng là các đối tượng trong Python, bao gồm cả chức năng Lambda :
obj = lambda: None
obj.test = "Hello, world!"
Ví dụ:
In [18]: x = lambda: None
In [19]: x.test = "Hello, world!"
In [20]: x.test
Out[20]: 'Hello, world!'
Tôi thích giải pháp này, vì không cần đặt tên –
Hmmm, nhưng nó có nhược điểm là bạn không thể gán cho 'x .__ class __. somefunc' –
Có, bằng Python 3.3 SimpleNamespace đã được thêm
Không giống như đối tượng, với SimpleNamespace bạn có thể thêm và xóa thuộc tính. Nếu một đối tượng SimpleNamespace được khởi tạo với các đối số từ khóa, thì những đối tượng đó sẽ được thêm trực tiếp vào vùng tên cơ bản.
Ví dụ:
import types
x = types.SimpleNamespace()
x.happy = True
print(x.happy) # True
del x.happy
print(x.happy) # AttributeError. object has no attribute 'happy'
Tuyệt vời. Tôi đã hy vọng điều này đã được thực hiện dễ dàng hơn trong Python 3! – nealmcb
Bạn thậm chí có thể rút ngắn dòng đầu tiên thành 't = type ('',(), {})()' – Tiago