Anonymous 发表于 2023-5-5 18:12:17

元类怎么用

from decimal import Decimal
from abc import ABCMeta, abstractmethod

class List(type):
    pass

class Progressionmeta(type):
    def __call__(cls, *args, **kwargs):
      if len(kwargs) != 2:
            error = "SyntaxError"
            raise SyntaxError
      else:
            if "step" not in kwargs:
                error = "KeyError"
                raise KeyError
            else:
                if len(kwargs) != 3:
                  error = "SyntaxError"
                  raise SyntaxError
      return type.__call__(cls, *args, **kwargs)
   
class Progression(Progressionmeta, metaclass = ABCMeta):
    @abstractmethod
    def __init__(self):
      pass

    def __getitem__(self):
      pass

    def __iter__(self):
      pass

    def __next__(self):
      pass

    def __call__(self, *args, **kwargs):
      pass

class Arithmetic_progression(metaclass = Progression):
    def __init__(self, step, start=1):
      self.__start = Decimal(f"{start}")
      self.__step = list(step)
      _ = []
      for i in self.__step:
            i = Decimal(f"{i}")
            _.append(i)
      self.__step = _
      self.__x = Decimal("1")
      
    def __getitem__(self, index):
      return float(self.__start + Decimal((index * (index + 1) * (2 * index + 1) - 6) / 6) * self.__step +
                     Decimal(((index * (index + 1) - 2) / 2)) * self.__step +
                     Decimal(index - 1) * self.__step)
   
    def __iter__(self):
      return self
   
    def __next__(self):
      if self.x == Decimal("1"):
            self.__a = self.__start
            self.__x += Decimal("1")
            return float(self.a)
      else:
            self.__a = self.a + (self.__step * self.__x * self.__x) + (self.__step * self.__x) + self.__step
            self.__x += Decimal("1")
            return float(self.__a)

    def __call__(self, start, stop):
      sum_ = Decimal("0")
      for i in self:
            sum_ += i
      return sum_

Traceback (most recent call last):
File "C:\Users\aston\AppData\Local\Programs\Python\Python311\Python\Python学习\类\list.py", line 39, in <module>
    class Arithmetic_progression(metaclass = Progression):
TypeError: Progression.__init__() takes 1 positional argument but 4 were given

isdkz 发表于 2023-5-5 18:12:18

这个错误是因为你在声明 Arithmetic_progression 时使用了错误的 metaclass 参数。你应该使用 Progression 作为元类,而不是将 Progression 设置为 Arithmetic_progression 的 metaclass 。下面是正确的声明:

class Arithmetic_progression(Progression):
    ...


另外,在 __getitem__() 方法中, kwargs 会引发一个 TypeError ,因为 kwargs 是一个字典,你应该使用 kwargs['step'] 来访问 step 参数。修改后的 ProgressionMeta 类应该如下:

class ProgressionMeta(type):
    def __call__(cls, *args, **kwargs):
      if len(kwargs) != 2:
            error = "SyntaxError"
            raise SyntaxError
      else:
            if "step" not in kwargs:
                error = "KeyError"
                raise KeyError
            else:
                if len(kwargs['step']) != 3:
                  error = "SyntaxError"
                  raise SyntaxError
      return type.__call__(cls, *args, **kwargs)
页: [1]
查看完整版本: 元类怎么用