2012-09-17 84 views
7

我正在使用Python 2.x框架,並且最近版本的框架已將一些廣泛使用的基類從模塊A移動到模塊B(以及類已經被重新命名爲更清晰的名字)。模塊A爲新的類名定義了一個向後兼容的標識符。不贊成使用類作爲Python中的父類

B.py:

class BaseClass(object): 
    __metaclass__ = framework_meta # handles registration etc. 

A.py:

import B 
oldbase = B.BaseClass 

現在,爲了幫助人們遷移自己的代碼,我想能夠發出DeprecationWarning(使用警告。警告),只要使用框架的代碼定義了從A.oldbase派生的類,就可以告訴程序員直接從B.BaseClass繼承。

我希望這可以通過元類來實現。我想聲明一個新的元類從框架與元類衍生

class deprecated_base_class(framework_meta): 
    def __new__(meta, name, bases, attrs): 
     warning = '%(class)s is deprecated' 
     for b in bases: 
      warning = getattr(b, '__deprecation_warning__', None) or warning 
     warn(warning % {'class': name}, DeprecationWarning, stacklevel=2) 
     return super(deprecated_base_class, meta).__new__(meta, name, bases, attrs) 

在一起:

A.py:

class oldbase(B.BaseClass): 
    __metaclass__ = deprecated_base_class 
    __deprecation_warning__ = 'class oldbase is deprecated. Use B.BaseClass instead' 

clientcode.py

class FooBar(oldbase): 
    pass 

這個問題我現在,是我得到一個DeprecationWarning的定義oldbase。我怎樣才能解決這個問題?

回答

2

你想要顯示的警告,如果任何一個基地被棄用:

class deprecated_base_class(framework_meta): 
    def __new__(meta, name, bases, attrs): 
     for b in bases: 
      if isinstance(b, deprecated_base_class): 
       warning = getattr(b, '__deprecation_warning__', '%(class)s is deprecated') 
       warn(warning % {'class': b.__name__}, DeprecationWarning, stacklevel=2) 
     return super(deprecated_base_class, meta).__new__(meta, name, bases, attrs)