首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用户输入不会传递到__init__

用户输入不会传递到__init__
EN

Stack Overflow用户
提问于 2016-11-18 22:25:35
回答 2查看 3.8K关注 0票数 0

我正在尝试创建一个多边形类,当给定用户输入的边和长度时,它返回面积和周长。但是,它不接受我试图传递给__init__方法的两个变量。边和长度必须是私有的,并且必须通过用户输入接收。

代码语言:javascript
复制
import math

class Polygon:
    use = (input("Enter in the sides and length of sides seperated by a comma"))
    ans = use.split(",")
    __numofSides = ans[0]
    __sideLength = ans[1]

    def __init__(self, __numofSides, __sideLength):
        self.__numofSides = __numofSides
        self.__sideLength = __sideLength

    def get__numofSides(self):
        self.__numofSides = ans[0]
        return __numofSides

    def get__sideLength(self):
        self.__sideLength = ans[1]
        return __sideLength

    def perimeter(self, __numofSides,__sideLength):
        peri = self. __numofSides * self.__sideLength
        return peri

    def area(self, __numofSides, __sideLength):
        area = (((__sideLength **2) * __numofSides) / (tan(4) *(math.pi/__numofSides))) 
        return area

    def __str___(self,):
        print("Number of Sides: {}\n Length of Sides: {}\n" \
              "Perimeter is: {}\n Area is: {}".format(__numofSides,__sideLength,peri,area))

def main():
    p1 = Polygon()
    p1.perimeter()
    p1.area()
    p1.__str__()

main()
EN

回答 2

Stack Overflow用户

发布于 2016-11-18 22:46:10

您似乎对OOP在Python中的工作方式有一个根本性的误解。当您实例化一个类时,将调用__init__()方法,并且通常将参数分配给实例变量,如下所示:

代码语言:javascript
复制
class Pet(object):

    def __init__(self, name):
        self._name = name # argument stored in self._name

然后,无论您想使用哪种方法,都可以通过实例来访问它们:

代码语言:javascript
复制
def get_name(self):
    return self._name

注意,此方法所做的全部工作就是将self._name返回给调用者。对于这种情况,使用decorators有一种常见的习惯用法

代码语言:javascript
复制
@property
def name(self):
    return self._name

get_name()相比,这有两个优点。首先,您可以调用不带括号的方法,就像它是实例变量一样:

代码语言:javascript
复制
my_pet = Pet('Rosita')
print(my_pet.name) 

>> Rosita

其次,如果用户后来试图用其他东西覆盖它,Python将引发一个AttributeError:

代码语言:javascript
复制
my_pet = Pet('Rosita')
my_pet.name = 'Maggie'

>> Traceback (most recent call last):
>> File "<stdin>", line 1, in <module>
>> AttributeError: can't set attribute

关于你的__repr__方法,我想你的意思是:

代码语言:javascript
复制
def __repr__(self):
    return "<Polygon sides={}; length={}; perimeter={}; area={}>".format(
        self.sides, self.side_length, self.perimeter, self.area)

当您执行print(my_polygon)str(my_polygon)时,会调用__repr__,因此它应该返回一个字符串。

最后,您可能已经注意到,我使用一个前导下划线而不是两个前导下划线来命名实例变量。如果你想让你的类的用户知道一个特定的实例变量是“私有的”,并且他们不应该弄乱它,最好在它的名字前面只加一个下划线。这样做的原因是,它允许您具有相同名称的访问器方法和实例变量,同时避免使用name mangling。带有两个前导下划线的名称会损坏,因此通常不推荐使用。

考虑到所有这些,这里重写一下你的代码:

代码语言:javascript
复制
import math

class RegularPolygon(object):

    def __init__(self, sides, side_length):
        self._sides = sides
        self._side_length = side_length

    @property
    def sides(self):
        return self._sides

    @property
    def side_length(self):
        return self._side_length

    @property
    def perimeter(self):
        return self.sides * self.side_length

    @property
    def area(self):
        return ((self.side_length**2 * self._sides) 
                / (4 * math.tan(math.pi / self.sides)))

    def __repr__(self):
        return "<Polygon sides={}; length={}; perimeter={}; area={}>".format(
            self.sides, self.side_length, self.perimeter, self.area)


if __name__ == '__main__':
    poly = RegularPolygon(5, 7)
    print(poly)
票数 4
EN

Stack Overflow用户

发布于 2016-11-18 22:42:45

下面是代码的快速审查(不考虑数学问题):

您可以从object继承(与Python2兼容):

代码语言:javascript
复制
class Polygon(object):

简化参数名称,不要使用双下划线:

代码语言:javascript
复制
    def __init__(self, sides, length):
        self.sides = sides
        self.length = length

使用实例变量self.sidesself.length,删除参数:

代码语言:javascript
复制
    def perimeter(self):
        return self.sides * self.length

math.tan()替换tan()

代码语言:javascript
复制
    def area(self):
        return ((self.length ** 2) * self.sides) / (math.tan(4) * (math.pi / self.sides))

在您的main()函数中:

(对于Python2,请使用raw_input而不是input。)

代码语言:javascript
复制
use = input("Enter in the sides and length of sides separated by a comma: ")
ans = use.split(",")

将字符串值转换为int

代码语言:javascript
复制
sides = int(ans[0])
length = int(ans[1])

p1 = Polygon(sides, length)

使用print()函数打印结果

代码语言:javascript
复制
print(p1.perimeter())
print(p1.area())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40679450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档