鱼C论坛

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

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

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

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

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

x
  1. class rectangular:
  2.     length = 0
  3.     width = 0
  4.     def __init__(self,length,width):
  5.         n = 1
  6.         while n == 1:
  7.             if length<width:  #如果这里用了self.length和self.width
  8.                                 #的话,则代表的是调用类本身的属性
  9.                 print('你输入的长比宽小,输入错误了,请重新输入。')
  10.                 __init__(self,length,width)
  11.             else:
  12.                 self.length = length
  13.                 self.width = width
  14.                 n = 2
  15.                 return n
  16.             
  17.             
  18.     def getRect(self):
  19.         a = print('长宽分别为:',self.length,self.width)
  20.         return a
  21.     def getArea(self):
  22.         print('获取面积被调用了')
  23.         area = self.length*self.width
  24.         print('面积为:',area)
复制代码


我的问题是当实例化这个类的时候,需要输入矩形的长和宽,但是如果长比宽小则我就让用户就得重新在实例化一次,想过用递归可是用的不对
最佳答案
2017-6-22 15:13:31
给你改了下,错的比较多,不过就是不知道改过以后是不是你想要的功能。

  1. class Rectangular:
  2.     length = 0
  3.     width = 0
  4.    
  5.     def __init__(self, length, width):
  6.         if length < width:  # 如果这里用了self.length和self.width
  7.             # 的话,则代表的是调用类本身的属性
  8.             l, w = tuple(map(int, input('你输入的长比宽小,输入错误了,请重新输入,以,分割:').split(',')))
  9.             Rectangular.__init__(self, l, w)
  10.         else:
  11.             self.length = length
  12.             self.width = width
  13.    
  14.     def getRect(self):
  15.         return print('长宽分别为:', self.length, self.width)
  16.    
  17.     def getArea(self):
  18.         print('获取面积被调用了')
  19.         area = self.length * self.width
  20.         print('面积为:', area)


  21. r = Rectangular(3, 6)
  22. r.getRect()
  23. r.getArea()
复制代码


输出:
  1. 你输入的长比宽小,输入错误了,请重新输入,以,分割:6,4
  2. 长宽分别为: 6 4
  3. 获取面积被调用了
  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 | 显示全部楼层    本楼为最佳答案   
给你改了下,错的比较多,不过就是不知道改过以后是不是你想要的功能。

  1. class Rectangular:
  2.     length = 0
  3.     width = 0
  4.    
  5.     def __init__(self, length, width):
  6.         if length < width:  # 如果这里用了self.length和self.width
  7.             # 的话,则代表的是调用类本身的属性
  8.             l, w = tuple(map(int, input('你输入的长比宽小,输入错误了,请重新输入,以,分割:').split(',')))
  9.             Rectangular.__init__(self, l, w)
  10.         else:
  11.             self.length = length
  12.             self.width = width
  13.    
  14.     def getRect(self):
  15.         return print('长宽分别为:', self.length, self.width)
  16.    
  17.     def getArea(self):
  18.         print('获取面积被调用了')
  19.         area = self.length * self.width
  20.         print('面积为:', area)


  21. r = Rectangular(3, 6)
  22. r.getRect()
  23. r.getArea()
复制代码


输出:
  1. 你输入的长比宽小,输入错误了,请重新输入,以,分割:6,4
  2. 长宽分别为: 6 4
  3. 获取面积被调用了
  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-5-19 23:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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