鱼C论坛

 找回密码
 立即注册
查看: 1481|回复: 9

[已解决]如何实现重复调用构造方法

[复制链接]
发表于 2017-6-22 13:38:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class rectangular:
    length = 0
    width = 0
    def __init__(self,length,width):
        n = 1
        while n == 1:
            if length<width:  #如果这里用了self.length和self.width
                                #的话,则代表的是调用类本身的属性
                print('你输入的长比宽小,输入错误了,请重新输入。')
                __init__(self,length,width)
            else:
                self.length = length
                self.width = width
                n = 2
                return n
            
            
    def getRect(self):
        a = print('长宽分别为:',self.length,self.width)
        return a
    def getArea(self):
        print('获取面积被调用了')
        area = self.length*self.width
        print('面积为:',area)

我的问题是当实例化这个类的时候,需要输入矩形的长和宽,但是如果长比宽小则我就让用户就得重新在实例化一次,想过用递归可是用的不对
最佳答案
2017-6-22 15:13:31
给你改了下,错的比较多,不过就是不知道改过以后是不是你想要的功能。
class Rectangular:
    length = 0
    width = 0
    
    def __init__(self, length, width):
        if length < width:  # 如果这里用了self.length和self.width
            # 的话,则代表的是调用类本身的属性
            l, w = tuple(map(int, input('你输入的长比宽小,输入错误了,请重新输入,以,分割:').split(',')))
            Rectangular.__init__(self, l, w)
        else:
            self.length = length
            self.width = width
    
    def getRect(self):
        return print('长宽分别为:', self.length, self.width)
    
    def getArea(self):
        print('获取面积被调用了')
        area = self.length * self.width
        print('面积为:', area)


r = Rectangular(3, 6)
r.getRect()
r.getArea()

输出:
你输入的长比宽小,输入错误了,请重新输入,以,分割:6,4
长宽分别为: 6 4
获取面积被调用了
面积为: 24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-22 13:45:12 | 显示全部楼层
__init__   是 初始化方法
__new__  才是 构造方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-22 13:45:29 | 显示全部楼层
我想到如果不用构造方法,只用普通的方法,就可以设置一个变量来控制用户重复input直到输入的长比宽大,可是就想构造方法能不能也被重复调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-22 15:13:31 | 显示全部楼层    本楼为最佳答案   
给你改了下,错的比较多,不过就是不知道改过以后是不是你想要的功能。
class Rectangular:
    length = 0
    width = 0
    
    def __init__(self, length, width):
        if length < width:  # 如果这里用了self.length和self.width
            # 的话,则代表的是调用类本身的属性
            l, w = tuple(map(int, input('你输入的长比宽小,输入错误了,请重新输入,以,分割:').split(',')))
            Rectangular.__init__(self, l, w)
        else:
            self.length = length
            self.width = width
    
    def getRect(self):
        return print('长宽分别为:', self.length, self.width)
    
    def getArea(self):
        print('获取面积被调用了')
        area = self.length * self.width
        print('面积为:', area)


r = Rectangular(3, 6)
r.getRect()
r.getArea()

输出:
你输入的长比宽小,输入错误了,请重新输入,以,分割:6,4
长宽分别为: 6 4
获取面积被调用了
面积为: 24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-22 15:34:29 | 显示全部楼层
ooxx7788 发表于 2017-6-22 15:13
给你改了下,错的比较多,不过就是不知道改过以后是不是你想要的功能。

Rectangular.__init__(self, l, w)
改为
self.__init__(l, w)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-22 15:53:02 | 显示全部楼层
SixPy 发表于 2017-6-22 15:34
Rectangular.__init__(self, l, w)
改为
self.__init__(l, w)

很有道理,顺着他原来的写,也没想。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-22 21:19:44 | 显示全部楼层
SixPy 发表于 2017-6-22 13:45
__init__   是 初始化方法
__new__  才是 构造方法

谢谢,特地搜了__init__跟__new__的区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-22 21:21:25 | 显示全部楼层
ooxx7788 发表于 2017-6-22 15:53
很有道理,顺着他原来的写,也没想。

谢谢!!看了你重写的 搞懂了!! 就是不太明白这里Rectangular.__init(self,l,w)为什么要改成self.__init__(lw)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-22 21:34:35 | 显示全部楼层
蔡蔡蔡蔡姬丶 发表于 2017-6-22 21:21
谢谢!!看了你重写的 搞懂了!! 就是不太明白这里Rectangular.__init(self,l,w)为什么要改成self.__ini ...

这样就只在这个实例本身修改,而不是创造出一个新实例来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-22 21:51:50 | 显示全部楼层
ooxx7788 发表于 2017-6-22 21:34
这样就只在这个实例本身修改,而不是创造出一个新实例来。

谢谢!!懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-11 18:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表