鱼C论坛

 找回密码
 立即注册
查看: 2768|回复: 7

整了一上午没弄明白,求指点!!!!

[复制链接]
发表于 2015-9-23 11:35:16 | 显示全部楼层 |阅读模式

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

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

x
想把内嵌函数闭包,递归和类以及对象等知识通过一个简单的十进制转二进制例子来综合巩固糅合下,结果发现了如下问题: 6666.png


上图左边是运行结果,右边是自己编的代码,是正常可以运行得到结果的。但是如果我在里面加个self 就一直会出错,就是
将def __std__(decimalist,Binary):
       return '%s:%d --> %s:%s '%('Decimalist',decimalist,'Binary',Binary)

变为def __std__(self,decimalist,Binary):
       return '%s:%d --> %s:%s '%('Decimalist',self.decimalist,'Binary',self.Binary)  就一直会出错,
会出现:
TypeError: __std__() missing 1 required positional argument: 'Binary'
我现在对self 完全搞晕了,急求人指点!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-9-23 12:48:21 | 显示全部楼层
你需要先实例,在调用。因为你没实例他,他就没有你定义的self.XX。

PS: 下次贴代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-9-23 14:19:17 | 显示全部楼层
wei_Y 发表于 2015-9-23 12:48
你需要先实例,在调用。因为你没实例他,他就没有你定义的self.XX。

PS: 下次贴代码。

class Zhuanhuan(object):
    def __init__(self,decimalist,Binary):
        self.decimalist = decimalist
        self.Binary = Binary
    def __std__(decimalist,Binary):
       return '%s:%d --> %s:%s '%('Decimalist',decimalist,'Binary',Binary)
def shizhuaner(decimalist,string):
    Binary = string
    def huan(decimalist,string):
        nonlocal Binary
        if decimalist // 2 == 0:
            Binary += str(decimalist)
        else:
            Binary  += str(decimalist%2)
            huan(decimalist//2,string)
        return Binary
    return huan(decimalist,string)
def nima(decimalist):
    a=''
    if decimalist > 2**101:
        raise OverflowError('输入太大,超过默认递归的次数')
    new_Binary = shizhuaner(decimalist,a)[::-1]
    print(Zhuanhuan.__std__(decimalist,new_Binary))


这个是原始代码,没有问题,想知道为什么加上self就会出错!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 14:20:25 | 显示全部楼层
9999.png


这是代码图片!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 14:21:48 | 显示全部楼层
3333.png



这个是我把类单独拿出来加self 后调试的图片!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 14:42:07 | 显示全部楼层
夕阳游龙 发表于 2015-9-23 14:19
class Zhuanhuan(object):
    def __init__(self,decimalist,Binary):
        self.decimalist = dec ...

我就是想知道class里def __std__(decimalist,Binary): 与def __std__(self,decimalist,Binary)区别,为什么用def __std__(decimalist,Binary):我的程序能正常调用,给出正确想要的结果,而
def __std__(self,decimalist,Binary): 不行,是不是我的调用方式错了,正确的调用方式是怎么样的?比如:是不是该这样Zhuanhuan.__std__(x,y,z)还是Zhuanhuan.__std__(x,y) 参数x,y,z分别怎么赋值才正确调用,能否具体给下x,y,z值的例子!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-23 19:35:59 | 显示全部楼层
对于类的理解我也不是很懂,我理解的是self指的是自身这个类的实例。

所以当你直接调用类(Zhuanhuan)的方法(__std__)时,你首先需要给他一个self参数。
这和实例后在调用方法是不同的。
实例后调用方法时,self参数指代自己也就是实例。
不实例直接调用方法,self并不知道自己是谁。

对于self,并不是必须叫self,你高兴了可以叫他this,可以叫他i。神马玩意都行。
---
上面都是废话,下面是你的问题:
为什么你加了self会报错。
  1. class Zhuanhuan(object):
  2.     def __init__(self,decimalist,Binary):
  3.         self.decimalist = decimalist
  4.         self.Binary = Binary
  5.     def __std__(decimalist,Binary):
  6.        return '%s:%d --> %s:%s '%('Decimalist',decimalist,'Binary',Binary)
复制代码
  1. c = Zhuanhuan(3, 4)
复制代码

我实例了一个Zhuanhuan类。
  1. c.__std__(3, 4)
复制代码

我调用。
  1. TypeError: __std__() takes 2 positional arguments but 3 were given
复制代码

这是报错,他说__std__()只需要两个位置参数,但是我们给了3个。这里或许有些奇怪,我明明只给了3和4呀。没错,实例后他还会把自身当做第一个参数传入。所以我们虽然的__std__(3, 4)实际上他理解的是__std__(self, 3,4),但是只有两个参数,也就是说把decimalist当成了self。
  1. c.__std__(4)
复制代码
  1. TypeError: %d format: a number is required, not Zhuanhuan
复制代码

把参数减少一个就可以看到这点。
---
好吧,我还是没回答你的问题。
实例后调用,默认会传入一个自身参数。但是不实例直接调用,将不会传入自身,所以是正常的。
---
打个比喻(轻点吐槽~。)。
我用我的心脏,我调用我的心脏,默认发出造血的指令,他就会输出血。
但是我把他拿出来(当然我不想拿出来- -。)我就不能给他发出造血的指令,但是我还是可以从一头把血倒进去,他依然可以从另一边输出血。呃,好吧这个比喻也不恰当,血液的功能没有发挥,嘛,你懂就好~。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-24 11:12:07 | 显示全部楼层
wei_Y 发表于 2015-9-23 19:35
对于类的理解我也不是很懂,我理解的是self指的是自身这个类的实例。

所以当你直接调用类(Zhuanhuan)的 ...

嗯嗯,你说的很对,我已经完全知道恍悟到问题在哪儿了!我把代码稍微改了下,然后实例后调用它,正确了,觉得最好self绑定类!
  1. class Zhuanhuan(object):
  2.     def __init__(self,decimalist,Binary):
  3.         self.decimalist = decimalist
  4.         self.Binary = Binary
  5.     def __std__(self,decimalist,Binary):
  6.        return '%s:%d --> %s:%s '%('Decimalist',self.decimalist,'Binary',self.Binary)
  7. def shizhuaner(decimalist,string):
  8.     Binary = string
  9.     def huan(decimalist,string):
  10.         nonlocal Binary
  11.         if decimalist // 2 == 0:
  12.             Binary += str(decimalist)
  13.         else:
  14.             Binary  += str(decimalist%2)
  15.             huan(decimalist//2,string)
  16.         return Binary
  17.     return huan(decimalist,string)
  18. def nima(decimalist):
  19.     a=''
  20.     if decimalist > 2**101:
  21.         raise OverflowError('输入太大,超过默认递归的次数')
  22.     new_Binary = shizhuaner(decimalist,a)[::-1]
  23.     print(Zhuanhuan(decimalist,new_Binary).__std__(decimalist,new_Binary))
复制代码


之前
  1. print(Zhuanhuan.__std__(decimalist,new_Binary))
复制代码
是直接去调用,导致<class NoneType>,因而不会作为一个参数传入,而现在
  1. print(Zhuanhuan(decimalist,new_Binary).__std__(decimalist,new_Binary))
复制代码
就是把Zhuanhuan(decimalist,new_Binary)作为了一个实例了,会作为一个参数传入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-17 17:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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