相同的函数签名但不同的参数

2024-10-02 00:37:43 发布

您现在位置:Python中文网/ 问答频道 /正文

class BaseClass:
      @abstractmethod
       def example(self, param1, param2, param3=None):

class ConcreteA(BaseClass):    
      def example(self, param1, param2, param3):
          return True

class ConcreteB(BaseClass):
      def example(self, param1, param2):
          return False

我将此用作:

obj = self.fetch_obj()
obj.example(param1, param2, param3)

但问题是param3没有在ConcreteB中实现。。所以。。如果objConcreteB,那么我会得到一个错误。 有没有办法“重载”函数定义忽略param3如果它是 ConcreteB类?如何使param3在抽象类中真正成为可选的,并在这些类的实现中得到反映?你知道吗

不确定这是否有意义?你知道吗


Tags: selfnonetrueobjreturnexampledefclass
2条回答

是的,有道理!你知道吗

有一些方法可以做到这一点,其中之一是将param3作为可选设置,例如param3 = None,但这不是一种python方法。你知道吗

Pythonic的方法是使用*args**kwargs概念,让我给你看一些例子!你知道吗

举例来说:

#ex1:
def world_cup_titles(country, *args):
    print('Country: ', country)
    for title in args:
        print('year: ', title)

world_cup_titles('Brasil', '1958', '1962', '1970', '1994', '2002')

#ex2:
def build_tuple(*args):
    return args

message_tuple = build_tuple("hello", "planet", "earth", "take", "me", "to", "your", "leader")
print("Tipo: {} || Tupla: {}".format(type(message_tuple), message_tuple))

以**kwargs为例:

def calculate_price(value, **kwargs):
    tax_percentage = kwargs.get('tax_percentage')
    discount = kwargs.get('discount')

    if tax_percentage:
        value += value * (tax_percentage / 100)
    if discount:
        value -= discount

    return value

v1 = calculate_price(100)
print(v1)

v2 = calculate_price(10, discount=5.0)
print(v2 )

v3 = calculate_price(10, discount=5.0, tax_percentage=7)
print(v3)

所以你可以看到听起来更像Python,实际上这真的很容易!你知道吗

而不是..:

class ConcreteB(BaseClass):


      def example(self, param1, param2):
          """ (docstring) """
          #   [...] (user code)
          return False

。。。用途:

class ConcreteB(BaseClass):


      def example(self, param1, param2, param3=None):
          """ (docstring) """
          if param3 is not None:
              raise TypeError('Illegal call')
          #   [...] (user code)
          return False

相关问题 更多 >

    热门问题