w JavaScript byłoby:Jak tworzyć obiekty wbudowane z właściwościami w Pythonie?
var newObject = { 'propertyName' : 'propertyValue' };
Jak to zrobić w Pythonie?
w JavaScript byłoby:Jak tworzyć obiekty wbudowane z właściwościami w Pythonie?
var newObject = { 'propertyName' : 'propertyValue' };
Jak to zrobić w Pythonie?
obj = type('obj', (object,), {'propertyName' : 'propertyValue'})
Istnieją two kinds of type
function uses.
+1 za najlepszą odpowiedź. –
+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
http://docs.python.org/library/functions.html#type –
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'})
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
.
Tak, możesz to zrobić - ale z jakiegoś dziwnego powodu po prostu nie możesz użyć obiektu() - musisz stworzyć własną klasę. – Smashery
jeśli chcesz mieć wbudowaną klasę, możesz użyć 'obj = lambda: None', co jest dziwne, ale wykona niezbędne zadania ... – Peter
@Peter - Nie wiedziałem o tym. Jednak teraz, kiedy to widzę, podoba mi się odpowiedź SilentGhost znacznie lepiej. –
odpowiedź Piotra
obj = lambda: None
obj.propertyName = 'propertyValue'
Zadziwiające, jak to działa? –
@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
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = 'abc' # set your property and value
Nie ma potrzeby definiowania __setattr__, zobacz odpowiedź Chris –
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"]
.
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.
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
Inną realną opcją jest użycie namedtuple:
from collections import namedtuple
message = namedtuple('Message', ['propertyName'], verbose=True)
messages = [
message('propertyValueOne'),
message('propertyValueTwo')
]
taka sama składnia w Pythonie byłoby utworzyć słownik, a nie to, co chcę –
mógłbyś wyjaśnić dlaczego ** ** chcesz co pytasz dla? To może pomóc ludziom poprowadzić cię do lepszych, bardziej pythonic alternatyw. –
@coli Mam metodę, która zwraca obiekt z niektórymi właściwościami. W przypadku niepowodzenia metody, chcę utworzyć ten obiekt ręcznie. –