以不同的名称导入类两次

时间:2018-05-01 22:55:48

标签: python

故事很简单。我想两次导入不同名称的类。 这个理由很好看。

# This class enhances other classes with convinience methods
# I own this class
class CssMixin:
    def add_css_class(self, name: str):
        # Code to add css style to self

在另一个档案中:

# import class twice as Mixing and as Helper class
from breaffy.helper import CssMixin as Helper, CssMixin

# Enrich class with convinience methods
# ExternalClass is class from some third-party library
# And is not under my control
class MyClass(ExternalClass, CssMixin):

    def __init__(self):
        self.add_css_class("button-class")

        # another instance of ExternalClass
        # often used in GUI libraries 
        self.child = ExternalClass()

        # Here not to duplicate all GUI class hierarchy 
        # to use method as a helper and pass original ExternalClass as self
        Helper.add_css_class(self.child, "label-class")
  1. 这是Python中的正确标准方法吗?
  2. 还有哪些其他方法可以做到这一点?
  3. 是否有可能对原始类进行修补,以便从ExternalClass派生的所有类都将自动拥有add_css_class方法(不添加mixins)?这种方法更好吗?

3 个答案:

答案 0 :(得分:0)

这会有用吗?您只需为现有的type="submit"变量创建别名。

CssMixin

答案 1 :(得分:0)

如果要以不同的方式使用这两个类,那么将它们分成两个可能从父类继承的不同类似乎更加pythonic。这将使文档更加清晰。

答案 2 :(得分:0)

我认为您的界面不直观。特别是像

这样的调用
Helper.add_css_class(self.child, "label-class")

值得怀疑。阅读代码的人会想知道为什么你要在完全不相关的对象实例上调用类方法。在python中,类不用作命名空间。当python程序员看到像class.method(...)这样的函数调用时,他们会自动假设该方法与类之间存在强连接(例如,该方法可以返回该类的实例)。但是在你的代码中并非如此。

为了减少混淆,我会将界面拆分为函数和mixin类:

def add_css_class(obj, name: str):
    # Code to add css style to obj

class CssMixin:
    def add_css_class(self, name: str):
        add_css_class(self, name)

这意味着你的模块会像这样使用:

from breaffy.helper import CssMixin, add_css_class

class MyClass(CssMixin, ExternalClass):
    def __init__(self):
        self.add_css_class("button-class")

        self.child = ExternalClass()
        add_css_class(self.child, "label-class")