[英]Accessing the base classes of a class in a class decorator
我想為 class 禁用多個 inheritance,因此,它只能從一個 class 繼承。一種方法是通過元類,但我想使用 class 裝飾器來實現。
class NoMultipleInheritance(type):
def __new__(cls, name, bases, clsdict):
if (len(bases)>1):
raise Exception('multiple inheritance not allowed')
return super().__new__(cls, name, bases, clsdict)
class B(metaclass=NoMultipleInheritance):
pass
class C:
pass
class A(B, C):
pass
給
Exception: multiple inheritance not allowed
但是如何在 class 裝飾器中獲取基類呢?
def no_multiple_inheritance(cls):
# how do I get the base classes of a class here?
return cls
class B:
pass
class C:
pass
@no_multiple_inheritance
class A(B, C):
pass
這可以這樣解決,
def no_multiple_inheritance(cls):
if(len(cls.__bases__)>1):
raise Exception('no multiple inheritance allowed')
return cls
使用dir(type(cls))
,獲得所需的屬性列表
def deco(cls):
print(dir(type(cls)))
print(cls.__flags__, cls.__name__)
return cls
@deco
class C:
pass
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__',
'__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__',
'__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__instancecheck__',
'__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__',
'__ne__', '__new__', '__prepare__', '__qualname__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasscheck__', '__subclasses__', '__subclasshook__',
'__text_signature__', '__weakrefoffset__', 'mro']
284161 C
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.