Sınıf nesneleri (tamsayılar, dizgiler, vb.) Dışında hiçbir şey içermeyen birçok büyük sınıfla bir projeyi miras aldım. Özniteliklerin bir listesini manuel olarak tanımlamak için gerek duymadan bir öznitelik olup olmadığını kontrol edebilmek istiyorum.Python: Standart sözdizimini kullanarak bir sınıfın yinelenebilir hale getirilmesi mümkün mü?
Standart sözdizimini kullanarak bir python sınıfı kendini yineleyebilir mi? Yani, bir sınıfın bir örneğini oluşturmaya gerek olmadan for attr in Foo:
(veya hatta if attr in Foo
) kullanarak bir sınıfın tüm özniteliklerini yineleyebilmek istiyorum. Bunu __iter__
tanımlayarak yapabilirim, ama şu ana kadar aradığım şeyi yönetemedim.
ben şöyle bir __iter__
yöntemi ekleyerek ne istiyorum bazılarını elde ettik:
:>>> for x in Foo: ... print(x) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'classobj' object is not iterable
class Foo:
bar = "bar"
baz = 1
@staticmethod
def __iter__():
return iter([attr for attr in dir(Foo) if attr[:2] != "__"])
Ancak, bu oldukça ben aradığım başarmak gelmez
Buna rağmen, bu işler şu şekilde gerçekleşir:
>>> for x in Foo.__iter__(): ... print(x) bar baz
Güzel. OP'nin yaklaşımının neden işe yaramadığını açıklayabilir misiniz? Teşekkürler. – NPE
@aix: OP'nin yaklaşımının işe yaramamasının nedeni, '__iter__' yönteminin yalnızca sınıfın * örnekleri için * çalıştığıdır. Bu, "__iter__' yöntemini metaclassın örneklerine, yani sınıfa kadar dağıtır. – nmichaels
@nmichaels Bu mantıklı, açıklama için teşekkürler. – NPE