Trong javascript nó sẽ là:Làm cách nào để tạo các đối tượng nội tuyến bằng các thuộc tính trong Python?
var newObject = { 'propertyName' : 'propertyValue' };
Làm thế nào để làm điều đó bằng Python?
Trong javascript nó sẽ là:Làm cách nào để tạo các đối tượng nội tuyến bằng các thuộc tính trong Python?
var newObject = { 'propertyName' : 'propertyValue' };
Làm thế nào để làm điều đó bằng Python?
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
+1 cho câu trả lời tốt nhất cho đến nay. –
+1 - Rất thú vị! Tôi không quen với việc sử dụng chức năng kiểu - bạn có thể vui lòng liên kết tôi với một số tài liệu về điều đó không? – Smashery
http://docs.python.org/library/functions.html#type –
Tôi không biết nếu có một cách tích hợp để làm điều đó, nhưng bạn luôn có thể định nghĩa một lớp như thế này:
class InlineClass(object):
def __init__(self, dict):
self.__dict__ = dict
obj = InlineClass({'propertyName' : 'propertyValue'})
Tôi thích Smashery's ý tưởng, nhưng Python dường như nội dung để cho phép bạn chỉnh sửa các lớp học của riêng bạn:
>>> class Inline(object):
... pass
...
>>> obj = Inline()
>>> obj.test = 1
>>> obj.test
1
>>>
Hoạt động tốt trong Python 2.5 đối với tôi. Lưu ý rằng bạn phải thực hiện việc này với một lớp học có nguồn gốc từ object
- nó sẽ không hoạt động nếu bạn thay đổi dòng thành obj = object
.
Đúng, bạn có thể làm điều đó - nhưng vì một lý do lạ, bạn không thể sử dụng đối tượng() - bạn phải tạo lớp của riêng bạn. – Smashery
nếu bạn muốn một lớp nội tuyến, bạn có thể sử dụng 'obj = lambda: None', kỳ quái, nhưng sẽ thực hiện các tác vụ cần thiết ... – Peter
@Peter - Tôi không biết điều đó. Tuy nhiên, bây giờ tôi thấy nó, tôi thích câu trả lời của SilentGhost tốt hơn nhiều. –
câu trả lời Phêrô
obj = lambda: None
obj.propertyName = 'propertyValue'
Tuyệt vời, nó hoạt động như thế nào? –
@ManelClos anh ta đang tạo ra một đối tượng hàm trả về không có gì mà bạn có thể nhìn thấy với obj(). Đối tượng hàm có thể có các thuộc tính. – jeremyjjbrown
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = 'abc' # set your property and value
Không cần phải xác định __setattr__, xem phản hồi của Chris –
Nó rất dễ dàng bằng Python để khai báo một lớp học với một __init__()
chức năng đó có thể thiết lập các ví dụ cho bạn, với đối số tùy chọn. Nếu bạn không chỉ định các đối số bạn nhận được một cá thể trống và nếu bạn chỉ định một số hoặc tất cả các đối số mà bạn khởi tạo cá thể.
Tôi đã giải thích nó here (câu trả lời được xếp hạng cao nhất của tôi cho đến nay) vì vậy tôi sẽ không nhập lại lời giải thích. Nhưng, nếu bạn có câu hỏi, hãy hỏi và tôi sẽ trả lời.
Nếu bạn chỉ muốn một đối tượng chung chung mà lớp không thực sự quan trọng, bạn có thể làm điều này:
class Generic(object):
pass
x = Generic()
x.foo = 1
x.bar = 2
x.baz = 3
Một phần mở rộng rõ ràng sẽ có thêm một chức năng __str__()
đó in một cái gì đó hữu ích.
Thủ thuật này rất hay khi bạn muốn một từ điển thuận tiện hơn. Tôi thấy dễ dàng nhập x.foo
hơn x["foo"]
.
Python 3.3 thêm lớp SimpleNamespace
cho rằng mục đích chính xác:
>>> from types import SimpleNamespace
>>> obj = SimpleNamespace(propertyName='propertyValue')
>>> obj
namespace(propertyName='propertyValue')
>>> obj.propertyName
'propertyValue'
Ngoài các nhà xây dựng thích hợp để xây dựng các đối tượng, SimpleNamespace
định nghĩa __repr__
và __eq__
(documented in 3.4) để hành xử như mong đợi.
Wow, cảm ơn bạn! Tôi biết đã có một cái gì đó như thế này trong Python, và nó đã đi qua khoảng 10 liên kết để tìm thấy điều này. Cảm ơn! – dusktreader
Một lựa chọn khả thi là sử dụng namedtuple:
from collections import namedtuple
message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
message('propertyValueOne'),
message('propertyValueTwo')
]
cú pháp tương tự trong python sẽ tạo ra một từ điển, và đó không phải là những gì tôi muốn –
Ông có thể giải thích lý do tại sao ** ** bạn muốn những gì bạn đang yêu cầu cho? Nó có thể giúp mọi người hướng dẫn bạn lựa chọn thay thế tốt hơn, nhiều chất bổ dưỡng hơn. –
@coli Tôi có một phương thức trả về một đối tượng với một số thuộc tính. Trong trường hợp phương thức thất bại, tôi muốn tạo đối tượng này theo cách thủ công. –