python中的属性方法没有返回正确的值

Posted

技术标签:

【中文标题】python中的属性方法没有返回正确的值【英文标题】:Property method in python not returning correct value 【发布时间】:2022-01-20 09:40:15 【问题描述】:

我正在尝试解决我被要求使用属性方法来计算圆圈被创建的次数的问题。下面是相同的代码。

import os
import sys

#Add Circle class implementation below
class Circle:
    counter = 0
    def __init__(self,radius):
        self.radius = radius
        Circle.counter = Circle.counter + 1
        
    def area(self):
        return self.radius*self.radius*3.14
    
    def counters():
        print(Circle.counter)
    no_of_circles = property(counter)
      


if __name__ == "__main__":
    
        res_lst = list()
        lst = list(map(lambda x: float(x.strip()), input().split(',')))
        
        for radius in lst:
            res_lst.append(Circle(radius).area())
        
        print(str(res_lst), str(Circle.no_of_circles))

上面的代码为该区域提供了正确的输出,但计数器应该是 3,而不是我得到低于输出。下面是 input = 1,2,3 的输出

[3.14, 12.56, 28.26] <property object at 0x0000024AB3234D60>

我已经尝试了一切,但没有运气。在代码的主要部分 no_of_circles 被称为 Circle.no_of_circles 这表明它将使用 python 的属性方法。但是输出是错误的。请帮我找出哪里出错了。

【问题讨论】:

为什么需要no_of_circlescounter 分开? property 装饰器旨在使方法看起来像属性,因此您可以使用属性的语法。但是counter 已经是一个属性,因此可以使用属性的语法来访问它。 @kaya3 如果我不使用 no_of_circles 那么我该如何设置属性装饰器。代码的主要部分不会改变。您能编辑代码并告诉我需要在哪里进行更改吗? 【参考方案1】:

这是一个使用property 函数的简单工作示例。 注意:创建一个类的实例(一次)然后在整个代码中使用该实例始终是一个好习惯。最好使用self.counter 而不是Cirlcle.counter。 self 是 Circle。

#Add Circle class implementation below
class Circle:
    
    def __init__(self,value=0):
        self._counter = value
        
    def area(self, radius):
        return radius*radius*3.14
    
    def add_counter(self, value):
        print('add counter')
        self._counter += 1

    def get_counter(self):
        print('get counter')
        return self._counter

    no_of_circles = property(get_counter, add_counter)
      


if __name__ == "__main__":
    circle = Circle()
    area = []
    for idx in range(5):
        area.append(circle.area(idx))
        circle.add_counter(1)
    print("number of calls: ", circle.no_of_circles)
    print('area:', area)

输出(注意 get 和 add counter 是如何被调用的):

add counter
add counter
add counter
add counter
add counter
get counter
number of calls:  5
area: [0.0, 3.14, 12.56, 28.26, 50.24]

【讨论】:

感谢您的解释,但在我的问题中,我无法更改 main 部分中的代码这意味着我无法创建实例。现在您可以在不创建实例的情况下获得相同的输出。我的意思是我的问题是原始代码..为什么 Circle.no_of_circles 不起作用?以及它将如何工作。所有可以更改和调整的代码都在 main 部分之上。【参考方案2】:

str(Circle.no_of_circles) 在这里,您调用的是类的属性,而不是该类的实例,即 Circle 对象;以下将起作用:-

class Circle:
    counter = 0
    def __init__(self,radius):
        self.radius = radius
        Circle.counter = Circle.counter + 1

    def area(self):
        return self.radius*self.radius*3.14

    def counters():
        print(Circle.counter)
    no_of_circles = property(counter)

if __name__ == "__main__":
        lst = list(map(lambda x: float(x.strip()), input("Enter radius : ").split(',')))
        cir_lst = [Circle(_) for _ in lst]
        res_lst = [__.area() for __ in cir_lst]

        print(res_lst, cir_lst[-1].counter)

【讨论】:

@Programming-in-Python 这个问题不允许我编辑代码的主要部分。那么我需要编辑什么才能使其在不触及主要部分的情况下工作? @isilia 现在试试... @Programming-in-python .它现在工作。我们甚至不需要计数器功能。如果我们删除计数器功能并只保留行 - 属性(计数器) - 并且输出很好。您可以尝试相同的方法并让我知道这种行为的原因

以上是关于python中的属性方法没有返回正确的值的主要内容,如果未能解决你的问题,请参考以下文章

尝试从数组中的值中删除基于 MKMap 的引脚

python3返回值中的none

Vue没有根据方法更新计算属性,但是直接调用时相同的方法返回正确的值

Python 函数可以只返回两个值中的第二个吗?

math对象的主要方法

如何从 QMultiMap 中的值中获取键?