【问题标题】:What is the proper way to define a class when a function is an optional parameter?当函数是可选参数时,定义类的正确方法是什么?
【发布时间】:2022-01-20 12:17:35
【问题描述】:

我已经声明了一个接受函数作为可选参数的类。如果未设置此函数参数,则使用默认的类方法。否则,我使用我自己的函数。 我的代码结构如下:

class myClass:
    def __init__(self,msg,foo=None):
        self.msg=msg
        self.foo=foo
        
    def print(self):
        if (self.foo == None):
            self.innerPrint()
        else :
            self.foo(self.msg)
        
    def innerPrint(self):
        print("Inner Print : ",self.msg)
        
def outerPrint(msg):
    print("Outer Print : ",msg)

所以,

myObj1=myClass("Hello")
myObj1.print()

打印:内部打印:你好

myObj2=myClass("Hello",outerPrint)
myObj2.print()

打印:外打印:你好

这是正确的方法还是可以简化此代码?

有人发布了一个已被删除的答案(很不幸,因为它对我有帮助)。

所以这是我的新代码结构:

class myClass:
    def __init__(self,msg,foo=None):
        self.msg=msg
        self.printFoo=(foo or self._innerPrint)
        
    def print(self):
        self.printFoo(self.msg)
        
    def _innerPrint(self,msg):
        print("Inner Print : ",msg)
        
def outerPrint(msg):
    print("Outer Print : ",msg)

我的类方法:print 现在只有一行。这是一个好习惯吗?

【问题讨论】:

  • 你能说明这是如何使用的吗?
  • @scoot Hunter。好的,我编辑了我的问题
  • 即使您不知道怎么做,您认为可以简化什么复杂性?
  • @Scott Hunter。我编辑了我的问题。这个想法是有可能用外部函数重载类的方法。我希望我很清楚。
  • @Scott Hunter。当类被实例化时,如果提供了外部函数,就会使用这个函数。否则,将使用具有相同原型的内部方法。

标签: python python-3.x class


【解决方案1】:

您的第二个解决方案更好,因为无需为每次调用您的print 方法检查self.foo,它在__init__ 方法中分配一次。

您也可以为此使用“属性”:(我更改了您的一些变量名称以遵循命名约定)

from functools import partial

class MyClass:
    def __init__(self, msg, foo=None):
        self.msg = msg
        self.myprint = foo

    @property
    def myprint(self):
        return self._func

    @myprint.setter
    def myprint(self, fn):
        self._func = partial(fn, self.msg) if fn else self.inner_print

    def inner_print(self):
        print("Inner Print : ", self.msg)


def outer_print(msg):
    print("Outer Print : ", msg)


my_obj1 = MyClass("Hello")
my_obj1.myprint()
print("-----------------------------------")
my_obj1 = MyClass("Hello", outer_print)
my_obj1.myprint()

输出:

Inner Print :  Hello
-----------------------------------
Outer Print :  Hello

一旦你创建了你的类的一个实例,setter 就会在self.myprint = foo 行中被调用。当您的myprint 返回self._func 时,它要么是您的inner_print 函数,要么是使用传递的foo 函数创建的部分函数。

* 我使用部分类,因为我不得不这样做。你的outer_print 函数需要一个参数。

【讨论】:

  • 非常感谢。我的第二个解决方案有问题,因为方法和函数必须具有相同的原型。而且,正如您所说,在第一个中,每次调用该方法时都会进行检查,但原型可能不同。您的解决方案正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多