2016-05-08 8 views
2

私はクラス変数を検証し、フォーマットしようとしています。クラスはABCMetaのクラスを拡張して__metaclass__となり、まだ私の子クラスをインスタンス化できません。だから私はコードの下でこれを実行するとオブジェクトオブジェクトを出力し、 は出力しません。理由はわかります。しかし、私はそれをどうやってやるの?Pythonのフォーマットとそれをインスタンス化せずにクラス変数を検証

from abc import ABCMeta, abstractproperty 

class RuleBase(object): 
    __metaclass__ = ABCMeta 

    id = None 
    id = abstractproperty(id) 

    @property 
    def format_id(self): 
     try: 
      _id = 'R%02d' % self.id 
     except TypeError: 
      raise TypeError("ID must be an integer") 
     return _id 

    @classmethod 
    def verbose(cls): 
     print cls.format_id 

class Rule(RuleBase): 
    id = 1 

Rule.verbose() # prints property object and not R01 

私の理論では、これはうまくいくと思います。

class FormattingABCMeta(ABCMeta): 
    def __new__(mcl, classname, bases, dictionary): 
     # Format here, remove format_id property from RuleBase, 
     # and use FormattingABCMeta as metaclass for RuleBase. 
     return super(C, mcl).__new__(mcl, classname, bases, dictionary) 

しかし、私はあまりにもそれをねじっている感じ。では、これをどうやって行うのですか?そして私の理解は正しいのですか?助けを借りて をいただければ幸いです。

+1

プロパティのみ**インスタンスでは機能**、ありませんクラスで。彼らは単にクラスにバインドされていません。 'verbose'はクラスメソッドなので、' cls.format_id'を使うことはできません。 'format_id'をクラスメソッドにして呼び出す必要があります。 –

+1

代わりに[クラスプロパティ記述子](http://stackoverflow.com/questions/5189699/how-can-i-make-a-class-property-in-python)を作成することです。 –

答えて

2

ないあなたの目標が何であるかを完全に確認ができますが、 _id取得するにはCLSを渡すプロパティオブジェクトにFGETを使用する必要があります:

print cls.format_id.fget(cls) 
+0

はい、うまくいくでしょう。ありがとうございました。しかし、これはこれを行う最もpythonicな方法ですか?また、私の目標はあまりにも歪んで見えますか? RuleBaseを拡張している特定のルールがあり、その冗長性を印刷したいと思っています。インスタンスを作成せずにそれを行うのは奇妙ですか? –

+0

これは 'id'属性が常にクラス属性であることを前提としています。 –

+0

@AnshuKumar、Martijnがあなたの質問の下でコメントしたように、もう1つの選択肢はclassmethodにしてcls.format_id()を出力することですが、あなたの質問からクラス属性を扱っていると仮定するとうまくいきます。 –

関連する問題