2009-10-07 14 views
33

w JavaScript byłoby:Jak tworzyć obiekty wbudowane z właściwościami w Pythonie?

var newObject = { 'propertyName' : 'propertyValue' }; 

Jak to zrobić w Pythonie?

+0

taka sama składnia w Pythonie byłoby utworzyć słownik, a nie to, co chcę –

+6

mógłbyś wyjaśnić dlaczego ** ** chcesz co pytasz dla? To może pomóc ludziom poprowadzić cię do lepszych, bardziej pythonic alternatyw. –

+0

@coli Mam metodę, która zwraca obiekt z niektórymi właściwościami. W przypadku niepowodzenia metody, chcę utworzyć ten obiekt ręcznie. –

Odpowiedz

64
obj = type('obj', (object,), {'propertyName' : 'propertyValue'}) 

Istnieją two kinds of type function uses.

+1

+1 za najlepszą odpowiedź. –

+0

+1 - Bardzo interesujące! Nie byłem zaznajomiony z tym używaniem funkcji typu - czy mógłbyś połączyć mnie z jakąś dokumentacją? – Smashery

+1

http://docs.python.org/library/functions.html#type –

10

Nie wiem, czy jest wbudowany w sposób to zrobić, ale zawsze można zdefiniować klasę tak:

class InlineClass(object): 
    def __init__(self, dict): 
     self.__dict__ = dict 

obj = InlineClass({'propertyName' : 'propertyValue'}) 
4

lubię Smashery's pomysł, ale Python wydaje treści pozwalają modyfikować klasy na własną rękę:

>>> class Inline(object): 
...  pass 
... 
>>> obj = Inline() 
>>> obj.test = 1 
>>> obj.test 
1 
>>> 

Działa dobrze w Pythonie 2.5 dla mnie. Zauważ, że musisz to zrobić dla klasy pochodzącej z object - nie zadziała, jeśli zmienisz linię na obj = object.

+2

Tak, możesz to zrobić - ale z jakiegoś dziwnego powodu po prostu nie możesz użyć obiektu() - musisz stworzyć własną klasę. – Smashery

+5

jeśli chcesz mieć wbudowaną klasę, możesz użyć 'obj = lambda: None', co jest dziwne, ale wykona niezbędne zadania ... – Peter

+0

@Peter - Nie wiedziałem o tym. Jednak teraz, kiedy to widzę, podoba mi się odpowiedź SilentGhost znacznie lepiej. –

19

odpowiedź Piotra

obj = lambda: None 
obj.propertyName = 'propertyValue' 
+1

Zadziwiające, jak to działa? –

+0

@ManelClos tworzy obiekt funkcji, który zwraca brak, który można zobaczyć za pomocą obj(). Obiekt funkcji może mieć właściwości. – jeremyjjbrown

0
class test: 
    def __setattr__(self,key,value): 
     return value 


myObj = test() 
myObj.mykey = 'abc' # set your property and value 
+0

Nie ma potrzeby definiowania __setattr__, zobacz odpowiedź Chris –

2

Jest łatwy w Pythonie zadeklarować klasę z __init__() funkcji, które można skonfigurować instancję dla Ciebie, z opcjonalnymi argumentami. Jeśli nie określisz argumentów, otrzymasz pustą instancję i jeśli podasz niektóre lub wszystkie argumenty, które zainicjujesz instancję.

Wyjaśniłem to here (moja najwyżej oceniona odpowiedź do tej pory), więc nie będę ponownie pisać wyjaśnienia. Ale jeśli masz pytania, zapytaj, a ja odpowiem.

Jeśli chcesz tylko ogólny obiekt, którego klasa nie ma większego znaczenia, można to zrobić:

class Generic(object): 
    pass 

x = Generic() 
x.foo = 1 
x.bar = 2 
x.baz = 3 

Oczywistym przedłużenie byłoby dodać __str__() funkcję, która drukuje coś pożytecznego.

Ta sztuczka jest fajna, gdy chcesz mieć bardziej wygodny słownik. Łatwiej jest wpisać x.foo niż x["foo"].

9

Pythona 3,3 dodano klasy SimpleNamespace dla tego dokładnego celu:

>>> from types import SimpleNamespace 

>>> obj = SimpleNamespace(propertyName='propertyValue') 
>>> obj 
namespace(propertyName='propertyValue') 

>>> obj.propertyName 
'propertyValue' 

Oprócz odpowiedniego konstruktora zbudowania obiektu SimpleNamespace określa __repr__ i __eq__ (documented in 3.4) zachowuje się w oczekiwany sposób.

+1

Wow, dziękuję! Wiedziałem, że w języku Python musi być coś takiego, a znalezienie tego wymagało przeszukiwania około 10 linków. Dzięki! – dusktreader

0

Inną realną opcją jest użycie namedtuple:

from collections import namedtuple 

message = namedtuple('Message', ['propertyName'], verbose=True) 
messages = [ 
    message('propertyValueOne'), 
    message('propertyValueTwo') 
] 
Powiązane problemy