Bir sınıf verildiğinde Foo
( yeni stil sınıf olsun ya da olmasın), tüm temel sınıfları - kalıtım hiyerarşisinin herhangi bir yerinde - nasıl issubclass
oluşturursunuz?
Bir sınıf verildiğinde Foo
( yeni stil sınıf olsun ya da olmasın), tüm temel sınıfları - kalıtım hiyerarşisinin herhangi bir yerinde - nasıl issubclass
oluşturursunuz?
Yanıtlar:
inspect.getmro(cls)
hem yeni hem de eski stil sınıfları için çalışır ve şununla aynı şeyi döndürür NewClass.mro()
: yöntem çözümlemesi için kullanılan sırayla, sınıfın ve tüm üst sınıfların bir listesi.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
inspect.getmro(obj)
yerine yapmaya çalışıyordun inspect.getmro(type(obj))
.
Bkz __bases__
özelliğini piton geçerli class
bazlar sınıfların bir demet içerir:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
getmro
açıkça "Hiçbir sınıf bu dizide birden fazla görünmüyor" diyor?
__bases__
sadece bir seviye yukarı çıkar . (Yinelemeli yardımcı programınızın ima ettiği gibi, ancak örneğe üstünkörü bir bakış bunu anlayamayabilir.)
inspect.getclasstree()
sınıfların ve tabanlarının iç içe geçmiş bir listesini oluşturacaktır. Kullanımı:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
__bases__
sınıf nesnesinin demetini kullanabilirsiniz :
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Tarafından döndürülen demet __bases__
tüm temel sınıflarına sahiptir.
Umarım yardımcı olur!
__bases__
Python 3.7'de inspect'i içe aktarmanıza gerek yoktur, type.mro size sonucu verecektir.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
python 3.x'te her sınıfın temel nesne sınıfından miras aldığına dikkat edin.
Göre Python doc , biz de sadece kullanabilirsiniz class.__mro__
Özellik veya class.mro()
yöntem:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
Jochen'in cevabı çok yararlı ve doğru olsa da, sınıf hiyerarşisini inspect modülünün .getmro () yöntemini kullanarak elde edebileceğinizden, Python'un kalıtım hiyerarşisinin aşağıdaki gibi olduğunu vurgulamak da önemlidir:
örn:
class MyClass(YourClass):
Miras alan bir sınıf
örn:
class YourClass(Object):
Miras alınan bir sınıf
Bir sınıf diğerinden miras alabilir - Nitelikli sınıf miras alınır - özellikle yöntemleri miras alınır - bu, miras alan (alt) sınıfın örneklerinin miras alınan (üst) sınıfın özniteliğine erişebileceği anlamına gelir
örnek -> sınıf -> sonra devralınan sınıflar
kullanma
import inspect
inspect.getmro(MyClass)
size Python içindeki hiyerarşiyi gösterecektir.