2012-05-30 19 views
20

Jaki jest najprostszy sposób utworzenia nagiego obiektu, do którego mogę przypisać atrybuty?Python proste nagie obiekty

Szczególnym przypadkiem użycia jest: Robię różne operacje na instancji obiektu Django, ale czasami instancja jest Brak (jest na instancji). W tym przypadku chciałbym stworzyć najprostszy możliwy fałszywy obiekt, aby móc przypisać wartości jego atrybutom (np. myobject.foo = 'bar').

Zasadniczo szukam odpowiednik Python tego kawałka javascript:

myobject = {} 
myobject.foo = 'bar' 

wiem, że mogę użyć atrapa obiektu/biblioteki dla tego, ale mam nadzieję na rozwiązanie bardzo proste (tak proste, jak powyższy Javascript). Czy istnieje sposób na stworzenie instancji nagiego obiektu? Coś jak:

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

To wydaje się całkiem nagi do mnie. Czym dokładnie jest próg, na którym chcesz pozostać poniżej? – Karmel

+3

Powyższy kod Pythona jest dość nagi, ale niestety tak naprawdę nie działa. – Parand

+0

Tak, to jest to, co dostaję za komentowanie zbyt szybko. Oczywiście :) – Karmel

Odpowiedz

27

Musisz utworzyć prostą klasę pierwszy:

class Foo(object): 
    pass 

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

Możesz ustawić jeden taki liniowiec:

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

Wywołanie funkcji type działa identycznie jak poprzednia instrukcja class.

Jeśli chcesz być naprawdę minimalny ...

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

Kluczem jest to, że wbudowanych typów (takich jak list i object) nie obsługują atrybutów zdefiniowanych przez użytkownika, dzięki czemu trzeba utworzyć typ za pomocą instrukcji class lub wywołania do 3-parametrowej wersji type.

+0

Fajnie, to naprawdę bardzo minimalne. Niestety również całkiem nieczytelne, więc pójdę z pierwszą metodą obiektu, którą polecasz. Jeśli ktoś ma minimalną, ale czytelną wersję, nadal jestem w grze ... – Parand

+0

Nie musi w rzeczywistości dziedziczyć z obiektu: 'class Dummy(): pass' będzie dobrze. –

+0

Prawdopodobnie. W miarę możliwości unikałem klas w starym stylu w Pythonie 2. – chepner

0

Może szukasz czegoś takiego:

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

następnie można go nazwać jak:

print myobject['foo'] 

lub można użyć obiektu klasy do tego:

the n można użyć coś takiego:

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

Staram się używać notacji kropkowej do uzyskiwania dostępu do atrybutów, więc ten sam kod, który manipuluje instancjami obiektu django, może nad tym pracować - dlatego chciałbym, aby mój_obiekt.foo zamiast myobject ['foo'] – Parand

+0

To jest dyktando w pytonie, a nie obiekt. – bschlueter

1

trzeba byłoby podklasy przedmiotu pierwszy tak ...

class Myobject(object): 
    pass 

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

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

Powinieneś po prostu użyć dyktatu, zgodnie z odpowiedzią @ PsychicOak.

Jednakże, jeśli naprawdę chcesz obiektu można manipulować, spróbuj:

class FooClass(object): pass 

Następnie można przypisać atrybuty na FooClass się, czy w instancjach, jak chcesz.

6

pomocą modułu Bunch:

sudo pip install bunch 

Grono to słownik, który pozwala na dostęp do jego zawartości poprzez składni dict.key.

A potem tak:

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

I zazwyczaj wolą tworzyć null object dla mojej klasy:

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


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

Potem go używać gdzie chciałbym używać nagi obiekt.

2

Wracam tu bardzo późno, ale jestem zaskoczony nikt nie wspomniał namedtuples, których osiągnięcia tego rodzaju rzeczy:

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

Aby użyć namedtuple, powinniśmy znać atrybuty z wyprzedzeniem, co może nie mieć miejsca w tym przypadku. W tym przypadku nie można dodawać dowolnych atrybutów do obiektów. – aravindsagar