IC # bunu yansıtma yoluyla yapıyoruz. Javascript'te şu kadar basit:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Python'da nasıl yapılır?
@property
.
IC # bunu yansıtma yoluyla yapıyoruz. Javascript'te şu kadar basit:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
Python'da nasıl yapılır?
@property
.
Yanıtlar:
for property, value in vars(theObject).iteritems():
print property, ": ", value
Bazı ender durumlarda __slots__
, bir özellik bulunduğunu, bu tür sınıfların çoğu zaman hiç olmadığını unutmayın __dict__
.
__setattr__()
. Değerleri doğrudan sözlük üzerinden ayarlamak, nesnenin ayarlayıcısını (ve / veya üst öğelerini) atlar. Python'da, öznitelik ayarı (örneğin sanitasyon) sırasında arka planda gözle görmekten çok daha fazla şeyin gerçekleşmesi oldukça yaygındır, kullanmak setattr()
, bunları kaçırmamanızı veya bunları açıkça kendiniz işlemeye zorlanmanızı sağlar.
vars()
yalnızca statik üyeler döndürür (yani, nesne öznitelikleri ve o nesneye kaydedilmiş yöntemler __dict__
). O mu değil dönmek dinamik üyeleri (dinamik olarak o nesnenin tanımladığı, yani nesne özelliklerini ve yöntemlerini __getattr__()
yöntemiyle veya benzer büyü). Büyük olasılıkla, istediğiniz file.ImplementationName
özellik dinamik olarak tanımlanan ve dolayısıyla değil mevcut vars()
veya dir()
.
Bakın inspect.getmembers(object[, predicate])
.
Ada göre sıralanmış (ad, değer) çiftleri listesinde bir nesnenin tüm üyelerini döndürür. İsteğe bağlı yüklem bağımsız değişkeni sağlanırsa, yalnızca yüklemenin gerçek bir değer döndürdüğü üyeler dahil edilir.
>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
attributes
yerine terimi kullandığı için members
(ikisi arasında herhangi bir fark var mı?). Tutarlı hale getirmek için Python 3.0'da adı sabitleyebilirlerdi.
__dict__
Üzgünüm demek istedim.
inspect.getmembers()
sargıları dir()
arasında (çoğunlukla ihmal edilebilir) bir yan fayda (A) dahil olmak üzere, dinamik sınıfı öznitelikleri ve metaclass nitelikleri ve (B) ' hariç üye olup geçirilen yüklemi bulundu. Esnemek, değil mi? inspect.getmembers()
olası tüm nesne türlerini genel olarak destekleyen üçüncü taraf kitaplıkları için uygundur. Ancak standart kullanım durumları için dir()
kesinlikle yeterlidir.
dir()
basit bir yoldur. Buraya bakın:
dir()
teşekkür ederim unutuyorum .
__dict__
Nesnenin özelliği tüm diğer tanımlanmış özelliklerin bir sözlüktür. Python sınıflarının getattr'ı geçersiz kılabileceğini
ve özellikler gibi görünen ama içinde olmayan şeyler yapabileceğini unutmayın __dict__
. Ayrıca yerleşik işlevleri var vars()
ve dir()
ince şekilde farklıdır. Ve bazı alışılmadık sınıflarda __slots__
yerini alabilir __dict__
.
Python'da nesneler karmaşıktır. __dict__
yansıtma tarzı programlamaya başlamak için doğru yerdir. dir()
etkileşimli bir kabukta geziniyorsanız başlamanız gereken yerdir.
print vars.__doc__
olduğunu gösterir With an argument, equivalent to object.__dict__
Yani ince farklar ne olurdu?
georg scholly daha kısa versiyon
print vars(theObject)
Tüm özelliklerin yansımasını arıyorsanız, yukarıdaki cevaplar harika.
Bir sözlüğün anahtarlarını (Python'daki bir 'nesneden' farklı olan) almak istiyorsanız, şunu kullanın:
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
obj['key']
vs. obj.property
) ve soru nesne özellikleri hakkındaydı. Cevabımı buraya koyuyorum çünkü ikisi arasında kolay kafa karışıklığı var.
Bu tamamen diğer cevaplar tarafından kapsanmaktadır, ancak açıklayacağım. Bir nesnenin sınıf öznitelikleri ve statik ve dinamik örnek öznitelikleri olabilir.
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
statiktir, dyno
dinamiktir (cf. özellik dekoratörü) ve classy
bir sınıf özniteliğidir. Basitçe yaparsak __dict__
ya vars
da sadece statik olanı alırız.
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
Yani istersek diğerleri __dict__
her şeyi (ve daha fazlasını) alır. Bu, sihirli yöntemleri ve nitelikleri ve normal bağlı yöntemleri içerir. Öyleyse bunlardan kaçınalım:
d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}
type
Bir özellik dekore yöntemi (dinamik nitelik) ile adlandırılan, size iade değerin türünü değil verecektir method
. Bunu kanıtlamak için json bunu telafi edelim:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
Bir yöntem olsaydı çökerdi.
TL; DR. extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
üçünü de aramayı deneyin , ancak yöntemleri veya sihri değil.