2012-09-17 58 views
7

Tôi đang làm việc với khung 2.x Python và phiên bản mới nhất của khung đã chuyển một số lớp cơ sở được sử dụng rộng rãi từ mô-đun A sang mô-đun B (và các lớp học đã được đổi tên thành một tên rõ ràng hơn trong quá trình này). Mô-đun A xác định số nhận dạng tương thích ngược cho tên lớp mới.Không sử dụng lớp học làm lớp cha trong Python

B.py:

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

A.py:

import B 
oldbase = B.BaseClass 

Bây giờ để giúp mọi người di chuyển mã của họ, tôi muốn để có thể đưa ra một DeprecationWarning (sử dụng cảnh báo. cảnh báo) bất cứ khi nào mã sử dụng khung định nghĩa một lớp bắt nguồn từ A.oldbase yêu cầu lập trình viên kế thừa trực tiếp từ B.BaseClass.

Tôi mong đợi điều này có thể đạt được bằng metaclass. Tôi cố gắng để khai báo một metaclass mới phát sinh từ các metaclass khuôn khổ

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) 

cùng với:

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 

Vấn đề tôi có bây giờ, là tôi nhận được một DeprecationWarning cho định nghĩa của oldbase. Làm thế nào tôi có thể sửa lỗi này?

Trả lời

2

Bạn muốn hiển thị cảnh báo nếu một trong các căn cứ được chấp nhận:

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) 
Các vấn đề liên quan