微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将类方法和实例方法调用的类似方法结合起来的 Pythonic 方式

如何解决将类方法和实例方法调用的类似方法结合起来的 Pythonic 方式

我有一个包含方法和类方法的类来创建图形。该类在类和实例级别上还有一个属性 auto_show。这用于决定是否应自动显示创建的图形。现在我需要两种不同的方法来实现这一点:

class MyClass:
    auto_show = True
    ...
    def __init__(self,...):
        self.auto_show = MyClass.auto_show
        ...

    @classmethod
    def _class_auto_show_figure(cls,fig):
        """Should be used only for class methods"""
        if cls.auto_show:
            fig.show()

    def _auto_show_figure(self,fig):
        if self.auto_show:
            fig.show()

现在第一个在所有类方法调用,第二个在所有实例方法调用。我想将它们组合在一种方法中,但找不到令人满意的方法来做到这一点。是否有一个很好的解决方案,或者我应该坚持使用两种不同的方法来做基本相同的事情? (顺便说一句。与类属性相比,实例可以具有不同的 auto_show 值很重要。)

解决方法

您可以通过以下方式使用一个函数来做到这一点:

class MyClass: 
     auto_show = True 
     
     def __init__(self): 
         self.auto_show = MyClass.auto_show  # can be changed to (obj.__class__).auto_show 



     def fun(self=None): 
         if self==None: 
              print("class auto_show:",MyClass.auto_show) 
         else: 
              print("instance auto_show:",self.auto_show) 
                                                                                                                                                                                              

obj=MyClass()                                                                                                                                                                             

MyClass.fun()                                                                                                                                                                             
out: class auto_show: True

obj.fun()                                                                                                                                                                                 
out: instance auto_show: True

obj.auto_show = False                                                                                                                                                                     

MyClass.fun()                                                                                                                                                                             
out: class auto_show: True

obj.fun()                                                                                                                                                                                 
instance auto_show: False

检查此方法是否符合您的要求。

,

这是使用 descriptor protocol 的解决方案:

from functools import partial

class ClassOrInstanceMethod:
    def __init__(self,f):
        self.f = f
    def __get__(self,instance,cls=None):
        return partial(self.f,cls,instance)

class Foo:
    data = 'Foo class data'
    def __init__(self,data):
        self.data = data
    
    @ClassOrInstanceMethod
    def test(cls,instance):
        if instance is None:
            print(cls.data)
        else:
            print(instance.data)

class Bar(Foo):
    data = 'Bar class data'

Foo.test() # prints 'Foo class data'
Bar.test() # prints 'Bar class data'
Foo('Foo instance data').test() # prints 'Foo instance data'
Bar('Bar instance data').test() # prints 'Bar instance data'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。