当前位置: 首页 > 知识库问答 >
问题:

Python:如何在Python的静态方法中键入提示类参数?[副本]

池砚文
2023-03-14

假设我有一个类Circle,定义如下:

class Circle:
    def __init__(self, r, _id):
        self.r = r
        self.id =  _id

    def area(self):
        return math.pi * (self.r ** 2)

我想写一个函数比较两个圆并返回最小的一个的id

def compare_circles(circle_1: Circle, circle_2: Circle) -> str:
    if circle_1.r < circle_2.r:
        return circle_1.id
    else:
        return circle_2.id

我想将此方法作为静态方法放置在类上。(这是个坏主意吗?)

class Circle:
    
    def __init__(self, r, _id):
        self.r = r
        self.id =  _id

    def area(self):
        return math.pi * (self.r ** 2)

    @staticmethod
    def compare_circles(circle_1: Circle, circle_2: Circle) -> str:
        if circle_1.r < circle_2.r:
            return circle_1.id
        else:
            return circle_2.id

但是,这不起作用,因为对象不可用于类型提示。我必须删除方法中的类型提示。使用classmethod也不起作用,因为cls参数对其他方法参数不可用。

共有1个答案

许照
2023-03-14

在这种情况下,一个可能的解决方法是在定义类后对方法进行猴子补丁:

class Circle:
    def __init__(self, r, _id):
        self.r = r
        self.id =  _id

    def area(self):
        return math.pi * (self.r ** 2)


def compare_circles(circle_1: Circle, circle_2: Circle) -> str:
    if circle_1.r < circle_2.r:
        return circle_1.id
    else:
        return circle_2.id

Circle.compare_circles = staticmethod(compare_circles)
del compare_circles

通常的方法是提供类型名为的字符串:

class Circle:
    def __init__(self, r, _id):
        self.r = r
        self.id =  _id

    def area(self):
        return math.pi * (self.r ** 2)


    @staticmethod
    def compare_circles(circle_1: 'Circle', circle_2: 'Circle') -> str:
        if circle_1.r < circle_2.r:
            return circle_1.id
        else:
            return circle_2.id

另一方面,您也可以考虑将<代码> CopaReSwiteCube <代码>转换成一种方法:

def compare(self, other: 'Circle') -> str:
    if self.r < other.r:
        return self.id
    else:
        return other.id
 类似资料:
  • 我正在尝试创建静态类ActivitySetup,它用于为我的活动设置语言、主题等。我在设置主题方面有问题。现在我有以下代码: 但它会崩溃。我知道我应该使用而不是,但是我怎么做呢?如何将超类实例作为参数传递给静态方法?

  • 问题内容: 如果我有以下python代码: 它抱怨 如何在方法中访问类/静态变量? 问题答案: 代替使用或。分配给将创建一个静态变量,分配给将创建一个实例变量。

  •   在 Python 中,可以定义三种方法——实例方法、类方法和静态方法。   实例方法: 是我们在创建类时创建的普通方法。这些方法与对象有关。这些方法的语法是 def do_something(self) ,其中 self 指的是实例对象。   类方法: 与实例对象略有不同。它们与类绑定,而不是与类的对象绑定。这些用于执行类任务并可以更改类的状态。我们用@classmethod装饰器创建一个类方

  • 本文向大家介绍python的类方法和静态方法,包括了python的类方法和静态方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python的类方法和静态方法。分享给大家供大家参考。具体分析如下: python没有和C++中static关键字,它的静态方法是怎样的呢?还有其它语言中少有的类方法又是神马? python中实现静态方法和类方法都是依赖于python的修饰器来实现的。 大家注意

  • 问题内容: 如果我有以下python代码: 它抱怨 如何bar在方法中访问类/静态变量? 问题答案: 代替bar使用或。分配给将创建一个静态变量,分配给将创建一个实例变量。

  • 问题内容: Python中是否可以有无需初始化类即可调用的静态方法,例如: 问题答案: 是的,使用装饰器 请注意,某些代码可能使用旧的方法来定义静态方法,而将其staticmethod用作函数而不是装饰器。仅当你必须支持Python的旧版本(2.2和2.3)时,才应使用此选项。 这与第一个示例完全相同(使用),只是不使用漂亮的装饰器语法 最后,要谨慎使用!在极少数情况下,Python中需要使用静态