簡體   English   中英

在 class 裝飾器中訪問 class 的基類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM