0

ベースクラス内のサブクラス内の変数を、他のサブクラスに影響を与えずに動的に作成/設定できますか?ベースクラス内からサブクラスの変数/属性を設定する

たとえば、ここにこのコードを取る:そのコードで

class Base: 
    @classmethod 
    def __init__(cls,v): 
     cls.v=v 

class sub1(Base): 
    Base.__init__(1) 

class sub2(Base): 
    Base.__init__(5) 

sub1を作成するときに、そのv属性が1に等しいです。しかし、sub2を作成した場合、属性はsub1sub2の両方とも5になります。なぜこれがあるのか​​知るかもしれないと思う。私は、基本クラスの@classmethodがサブクラスの属性を実際に設定するのではなく、それ自身の属性を設定していると仮定します。その属性はサブクラスで継承されます。私の質問は:どのように継承される基本クラスの属性ではなく、サブクラスの属性を設定するために、この種の継承を使用することができます。

つまり、サブクラスに固有で、単純にグローバルに継承されていないサブクラスで属性を設定するためには、可能であれば(あるいは少なくとも単純なものも)同様の構造を使用できるようにしたいと思います。ベースクラスから。

これも可能ですか?

+0

はあなただけで行うことはできませんいくつかの理由がありますか?クラスステートメントのボディ内の割り当ては、メソッドの外で既にクラス属性を定義しています。それを行うための特別な方法は必要ありません。 '__init__'を' classmethod'にすると、メタクラスが本当に好きなように聞こえますが、クラス属性を設定したいのであれば、それは大過剰です。 – ShadowRanger

答えて

0

私はそれが他の方法で簡単に達成できるかどうか分かりませんが、私は自分自身でメタクラスを使って解決策を考え出しました。

ソリューション: `sub2`でsub1``で `V = 1 'と` V = 5`:

class MetaBase(type): 
    def __init__(cls, name, bases, namespace): 
     super(MetaBase, cls).__init__(name, bases, namespace) 
     if '_superclass' in namespace: # A special attribute to distinguish between superclasses and subclasses 
      if '_attrnames' not in namespace: 
       raise AttributeError('"_attrnames" needs to be defined as a class attribute in a superclass.') 
     else: 
      if 'classvars' in namespace: # Allow for define all required class attributes in one iterable attribute 
       for attrname, attr in zip(getattr(cls.__mro__[1], '_attrnames'), getattr(cls, 'classvars')): # Get all the varnames in the superclass's "varnames", as well as the values 
        setattr(cls, attrname, attr) 
        namespace[attrname] = attr 
       delattr(cls, 'classvars') 
      else: 
       for attrname in getattr(cls.mro()[1], '_attrnames'): 
        if attrname not in namespace: 
         raise AttributeError('"%s" not defined, but is required.' % attrname) 

class Base(metaclass=MetaBase): 
    _superclass = True # The value of this attribute doesn't matter 
    _attrnames = ('a','b','c') 

class Sub1(Base): 
    a = 1 
    b = 2 
    c = 3 

class Sub2(Base): 
    classvars = (1, 2, 3) 
関連する問題