{ property = value }
gibi herhangi bir sınıfın basit bir temsilcisine sahip olmak istiyorum, o zaman otomatik __repr__
var mı?Otomatik __repr__ yöntem
cevap
Eğer
__dict__
ifade ediyor mu?
Evet, bir sınıf "AutoRepr" yapmak ve tüm diğer sınıfların da uzatmak sağlayabilirsiniz:
Yukarıdaki kod (doğrudan veya dolaylı olarak) kendilerini referans veri yapıları üzerinde güzel hareket etmeyeceğini>>> class AutoRepr(object):
... def __repr__(self):
... items = ("%s = %r" % (k, v) for k, v in self.__dict__.items())
... return "<%s: {%s}>" % (self.__class__.__name__, ', '.join(items))
...
>>> class AnyOtherClass(AutoRepr):
... def __init__(self):
... self.foo = 'foo'
... self.bar = 'bar'
...
>>> repr(AnyOtherClass())
"<AnyOtherClass: {foo = 'foo', bar = 'bar'}>"
Not . Yukarıdaki fonksiyon önce de belirttiğimiz nedenlerden dolayı, bilerek, yinelemeli tanımlı olmadığından
>>> def autoRepr(obj):
... try:
... items = ("%s = %r" % (k, v) for k, v in obj.__dict__.items())
... return "<%s: {%s}." % (obj.__class__.__name__, ', '.join(items))
... except AttributeError:
... return repr(obj)
...
>>> class AnyOtherClass(object):
... def __init__(self):
... self.foo = 'foo'
... self.bar = 'bar'
...
>>> autoRepr(AnyOtherClass())
"<AnyOtherClass: {foo = 'foo', bar = 'bar'}>"
>>> autoRepr(7)
'7'
>>> autoRepr(None)
'None'
Not: Alternatif olarak, herhangi bir türüne çalışan bir fonksiyon tanımlayabilirsiniz.
Eh, diğer cevaplar biraz oynadı ve çok güzel bir çözüm var:
class data:
@staticmethod
def repr(obj):
items = []
for prop, value in obj.__dict__.items():
try:
item = "%s = %r" % (prop, value)
assert len(item) < 20
except:
item = "%s: <%s>" % (prop, value.__class__.__name__)
items.append(item)
return "%s(%s)" % (obj.__class__.__name__, ', '.join(items))
def __init__(self, cls):
cls.__repr__ = data.repr
self.cls = cls
def __call__(self, *args, **kwargs):
return self.cls(*args, **kwargs)
Bir dekoratör olarak kullanmak: dışarı akıllı __repr__
@data
class PythonBean:
def __init__(self):
self.int = 1
self.list = [5, 6, 7]
self.str = "hello"
self.obj = SomeOtherClass()
ve almak kutu:
PythonBean(int = 1, obj: <SomeOtherClass>, list = [5, 6, 7], str = 'hello')
Bu, ağaç yapıları dahil, özyinelemeli sınıflarla çalışır. self.ref = self
sınıfında öz referansı koymaya çalışırsanız, işlev yaklaşık bir saniye çalışacak (başarılı bir şekilde). Tabii
, her zaman patron akla - mine)) böyle bir sözdizimi şeker istemez
En basit yol: Ben sınıflar için Repr s oluşturmak için bu yardımcı işlevini kullanın
def __repr__(self):
return str(self.__dict__)
. Örneğin, doğru olmayan bir işlevle çalıştırmak kolaydır. Bu size daha sonra sınıfa kopyalama/yapıştırma ki, konsola çıktı potansiyel repr bir dizi gerektiği
def test_makeRepr(self):
makeRepr(Foo, Foo(), "anOptional space delimitedString ToProvideCustom Fields")
.
def makeRepr(classObj, instance = None, customFields = None):
"""Code writing helper function that will generate a __repr__ function that can be copy/pasted into a class definition.
Args:
classObj (class):
instance (class):
customFields (string):
Returns:
None:
Always call the __repr__ function afterwards to ensure expected output.
ie. print(foo)
def __repr__(self):
msg = "<Foo(var1 = {}, var2 = {})>"
attributes = [self.var1, self.var2]
return msg.format(*attributes)
"""
if isinstance(instance, classObj):
className = instance.__class__.__name__
else:
className=classObj.__name__
print('Generating a __repr__ function for: ', className,"\n")
print("\tClass Type: "+classObj.__name__, "has the following fields:")
print("\t"+" ".join(classObj.__dict__.keys()),"\n")
if instance:
print("\tInstance of: "+instance.__class__.__name__, "has the following fields:")
print("\t"+" ".join(instance.__dict__.keys()),"\n")
else:
print('\tInstance of: Instance not provided.\n')
if customFields:
print("\t"+"These fields were provided to makeRepr:")
print("\t"+customFields,"\n")
else:
print("\t"+"These fields were provided to makeRepr: None\n")
print("Edit the list of fields, and rerun makeRepr with the new list if necessary.\n\n")
print("repr with class type:\n")
classResult = buildRepr(classObj.__name__, " ".join(classObj.__dict__.keys()))
print(classResult,"\n\n")
if isinstance(instance, classObj):
instanceResult = buildRepr(instance.__class__.__name__, " ".join(instance.__dict__.keys()))
else:
instanceResult = "\t-----Instance not provided."
print("repr with instance of class:\n")
print(instanceResult,"\n\n")
if customFields:
customResult = buildRepr(classObj.__name__, customFields)
else:
customResult = '\t-----Custom fields not provided'
print("repr with custom fields and class name:\n")
print(customResult,"\n\n")
print('Current __repr__')
print("Class Object: ",classObj)
if instance:
print("Instance: ",instance.__repr__())
else:
print("Instance: ", "None")
def buildRepr(typeName,fields):
funcDefLine = "def __repr__(self):"
msgLineBase = ' msg = "<{typename}({attribute})>"'
attributeListLineBase = ' attributes = [{attributeList}]'
returnLine = ' return msg.format(*attributes)'
x = ['self.' + x for x in fields.split()]
xResult = ", ".join(x)
y = [x + ' = {}' for x in fields.split()]
yResult = ', '.join(y)
msgLine = msgLineBase.format(typename = typeName, attribute = yResult)
attributeListLine = attributeListLineBase.format(attributeList = xResult)
result = "{declaration}\n{message}\n{attributes}\n{returnLine}".format(declaration = funcDefLine,
message = msgLine,
attributes = attributeListLine,
returnLine =returnLine)
return result
- 1. str.format öğesini doğrudan '__repr__` olarak kullanabilir miyim?
- 2. UIMenuItem otomatik seçiciyi devre dışı bırak yöntem
- 3. İç içe geçmiş sınıf örnekleri için yararlı varsayılan __repr__
- 4. Form yardımcılarını kullanarak tabindex'i ayarlamak için otomatik yöntem
- 5. Yöntem, sınıfın otomatik olarak dahil edildiği tarafını açıkladı mı?
- 6. Poco sınıfı (nesne) bir yöntem parametresinden otomatik olarak nasıl oluşturulur?
- 7. VC++ 2010 Otomatik olarak yöntem saplama veya prototip oluştur
- 8. Phpstorm'un otomatik tamamlamada yöntem imzalarını getirmenin bir yolu var mı?
- 9. Type.GetProperties Yöntem
- 10. Yöntem, satır içi yöntem
- 11. yöntem
- 12. yöntem
- 13. Yöntem isimleri S100
- 14. java.lang.IllegalStateException: Yöntem [yöntem adı] yalnızca 1 yöntem alanı içerebilir. Bulunan: []
- 15. Bir super() nesnesinde dinamik yöntem çözünürlüğü
- 16. Yöntem için Yöntem nesnesini nasıl alabilirim?
- 17. java8: başka bir yöntem referansından yöntem başvurusu
- 18. Jquery otomatik tamamlama özel veri hatası Otomatik tamamlama pencere öğesi örneği için böyle bir yöntem 'örnek' yok
- 19. otomatik JBehave
- 20. otomatik
- 21. otomatik
- 22. otomatik
- 23. otomatik
- 24. aynı yöntem
- 25. Yöntem com.google.android.gms.common.GooglePlayServicesUtil.zza
- 26. DbProviderFactories.GetFactory Yöntem
- 27. Yöntem kalıtım
- 28. Yöntem çağrıldı?
- 29. Beklenen yöntem,
- 30. socket.FileSend Yöntem
__dict__ sınıf göstermiyor AnyOtherClass (object): foo = 'hello' –