我已經宣告了一個接受函式作為可選引數的類。當未設定此函式引數時,將使用默認的類方法。否則,我使用我自己的函式。我的代碼具有以下結構:
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現在只有一行。這是一個好習慣嗎?
uj5u.com熱心網友回復:
您的第二個解決方案更好,因為不需要檢查self.foo對您的print方法的每次呼叫,它在__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函式需要一個引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383910.html
下一篇:如果輸入==串列
