2012-05-30 51 views
20

Cách dễ nhất để tạo đối tượng trần truồng mà tôi có thể gán thuộc tính là gì?Đối tượng đơn giản của Python đơn giản

Trường hợp sử dụng cụ thể là: Tôi đang thực hiện các thao tác khác nhau trên một đối tượng Django, nhưng đôi khi trường hợp là Không (có ví dụ). Trong trường hợp này, tôi muốn tạo đối tượng giả có thể đơn giản nhất để tôi có thể gán các giá trị cho các thuộc tính của nó (ví dụ: myobject.foo = 'bar').

Về cơ bản tôi đang tìm kiếm tương đương Python của mảnh này của Javascript:

myobject = {} 
myobject.foo = 'bar' 

Tôi biết tôi có thể sử dụng một đối tượng giả/thư viện cho điều này, nhưng tôi hy vọng cho một giải pháp rất đơn giản (đơn giản như Javascript ở trên). Có cách nào để tạo một thể hiện đối tượng trần truồng? Một cái gì đó như:

myobject = object() 
myobject.foo = 'bar' 
+0

Điều đó có vẻ khá khỏa thân với tôi. Ngưỡng chính xác mà bạn muốn ở dưới đây là gì? – Karmel

+3

Mã python ở trên là khá khỏa thân, nhưng tiếc là nó không thực sự hoạt động. – Parand

+0

Vâng, đó là những gì tôi nhận được để bình luận quá nhanh. Tất nhiên :) – Karmel

Trả lời

27

Bạn cần phải tạo một lớp đơn giản đầu tiên:

class Foo(object): 
    pass 

myobject = Foo() 
myobject.foo = 'bar' 

Bạn có thể làm cho nó một lớp lót như thế này:

myobject = type("Foo", (object,), {})() 
myobject.foo = 'bar' 

Cuộc gọi đến các chức năng type giống với tuyên bố trước đó class.

Nếu bạn muốn trở thành thực sự tối thiểu ...

myobject = type("",(), {})() 

Điều quan trọng là được xây dựng trong các loại (như listobject) không hỗ trợ thuộc tính người dùng định nghĩa, vì vậy bạn cần tạo loại bằng cách sử dụng câu lệnh class hoặc cuộc gọi đến phiên bản 3 thông số của type.

+0

Đẹp, điều đó rất tối thiểu. Thật không may cũng khá khó đọc, vì vậy tôi sẽ đi với phương pháp đối tượng đầu tiên bạn đề nghị. Nếu bất cứ ai có một phiên bản tối thiểu nhưng có thể đọc được tôi vẫn đang chơi ... – Parand

+0

Thực ra không phải thừa hưởng từ đối tượng: 'class Dummy(): pass' sẽ làm tốt. –

+0

Có thể. Tôi tránh xa các lớp học kiểu cũ trong Python 2 nếu có thể. – chepner

0

Có lẽ bạn đang tìm kiếm một cái gì đó như thế này:

myobject={} 
myobject['foo']='bar' 

sau đó nó có thể được gọi như:

print myobject['foo'] 

hoặc bạn có thể sử dụng một đối tượng lớp cho việc này:

class holder(object): 
    pass 

n bạn có thể sử dụng một cái gì đó như thế này:

hold=holder() 
hold.myobject='bar' 
print hold.myobject 
+0

Tôi đang tìm kiếm cụ thể để sử dụng ký hiệu chấm để truy cập các thuộc tính để mã tương tự thao tác các đối tượng django có thể làm việc trên này - vì vậy tôi muốn myobject.foo thay vì myobject ['foo'] – Parand

+0

Đó là một dict trong python, không phải là một đối tượng. – bschlueter

1

Bạn sẽ cần phải phân lớp đối tượng đầu tiên như thế này ...

class Myobject(object): 
    pass 

myobject1 = Myobject() 
myobject1.foo = 'bar' 
2
class NakedObject(object): 
    pass 

myobject = NakedObject() 
myobject.foo = 'bar' 
0

Bạn có lẽ chỉ nên sử dụng một dict, theo câu trả lời của @ PsychicOak.

Tuy nhiên, nếu bạn thực sự muốn một đối tượng bạn có thể thao tác, hãy thử:

class FooClass(object): pass 

Sau đó bạn có thể gán thuộc tính trên FooClass chính nó, hoặc trên các trường hợp, như bạn muốn.

6

Sử dụng các mô-đun Bunch:

sudo pip install bunch 

Một bó là một cuốn từ điển cho phép để truy cập vào nội dung của nó thông qua cú pháp dict.key.

Và sau đó như thế:

from bunch import Bunch 
b = Bunch() 
b.foo = "Bar" 


b["foo2"] = "Bar2" 
print b 
>> Bunch(foo='Bar', foo2='Bar2') 
b["foo"] = "Baz" 
print b 
>> Bunch(foo='Baz', foo2='Bar2') 
0

Tôi thường thích để tạo ra một null object cho lớp học của tôi:

class User(Model): 
    username = CharField() 
    password = CharField() 


NONE_USER = User(username='', password='') 

Sau đó, tôi sử dụng nó, nơi tôi sẽ sử dụng đối tượng khỏa thân của bạn.

2

Tôi đến đây rất muộn, nhưng tôi ngạc nhiên không ai có đề cập namedtuples, mà thực hiện loại điều:

Foo = namedtuple('Foo', ['x']) 
f = Foo(x='myattribute') 
f.x 
+0

Để sử dụng tên đã đặt tên, chúng ta nên biết trước thuộc tính, có thể không phải là trường hợp ở đây. Bạn không thể thêm các thuộc tính tùy ý vào các đối tượng trong trường hợp này. – aravindsagar