鱼C论坛

 找回密码
 立即注册
查看: 771|回复: 4

[已解决]请教 关于类 类对象 self 的疑惑

[复制链接]
发表于 2018-7-8 15:38:07 | 显示全部楼层 |阅读模式
6鱼币
题目: 定义一个类,实例化该类的时候,自动判断传入了多少个参数,并显示出来.
代码:
  1. class Number():
  2.     def num(self, args):
  3.         number = 0
  4.         num = []
  5.         for each in args:
  6.             number += 1
  7.             num.append(each)
  8.         print('共传入了 %d 个参数 分别是:' %  number, end = '')
  9.         print(num)

  10. n = Number()
  11. n.num('I love you!')
复制代码


如果改成这样会报错代码:
  1. class Number():
  2.     def num(self):
  3.         number = 0
  4.         num = []
  5.         for each in self:
  6.             number += 1
  7.             num.append(each)
  8.         print('共传入了 %d 个参数 分别是:' %  number, end = '')
  9.         print(num)
  10. n = Number()
  11. n.num('I love you!')
复制代码

TypeError: num() takes 1 positional argument but 2 were given  self 不就是实例化对象么? 直接从 self 中获取字符 会出错?  麻烦用白话帮我普及一下 self  谢谢
刚看了一遍 书上 self 的章节,什么图纸什么房子的这个倒是看到了,我想问 函数后面括号里,有时候只有一个 self, 有时候self后面带参数,这个什么时候带参数,什么时候只用一个 self 呢?
最佳答案
2018-7-8 15:38:08
先说你的程序的问题:
1.函数名与变量名重名(num)
2.变量最好加上self. 这样可以在其它函数中共用。

1.TypeError: num() takes 1 positional argument but 2 were give,
实例化对象时第一个参数是实例化的名字,后面的才是你给的参数。
简单说明一下:
这是修改后的程序
  1. class Number():
  2.     def cal(self, *args):
  3.         number = 0
  4.         num = []
  5.         for each in args:
  6.             number += 1
  7.             num.append(each)
  8.         print('共传入了 %d 个参数 分别是:' %  number, end = '')
  9.         print(num)
复制代码

正常的调用是
  1. >>> n = Number()
  2. >>> n.cal('I love you!', 'Me too!')
  3. 共传入了 2 个参数 分别是:['I love you!', 'Me too!']
复制代码

我们也可以换个方式
>>> n = Number()
  1. >>> Number.cal(n, 'I love you!', 'Me too!')
  2. 共传入了 2 个参数 分别是:['I love you!', 'Me too!']
复制代码

这回可以看出self代表n了。

2.的确self就是实例化对象n,但n并不等于是num的参数 'I love you!', 'Me too!',这里是对其参数做解析,使用for语句后面是args

最佳答案

查看完整内容

先说你的程序的问题: 1.函数名与变量名重名(num) 2.变量最好加上self. 这样可以在其它函数中共用。 1.TypeError: num() takes 1 positional argument but 2 were give, 实例化对象时第一个参数是实例化的名字,后面的才是你给的参数。 简单说明一下: 这是修改后的程序 正常的调用是 我们也可以换个方式 >>> n = Number() 这回可以看出self代表n了。 2.的确self就是实例化对象n,但n并不等于是num的参数 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-8 15:38:08 | 显示全部楼层    本楼为最佳答案   
先说你的程序的问题:
1.函数名与变量名重名(num)
2.变量最好加上self. 这样可以在其它函数中共用。

1.TypeError: num() takes 1 positional argument but 2 were give,
实例化对象时第一个参数是实例化的名字,后面的才是你给的参数。
简单说明一下:
这是修改后的程序
  1. class Number():
  2.     def cal(self, *args):
  3.         number = 0
  4.         num = []
  5.         for each in args:
  6.             number += 1
  7.             num.append(each)
  8.         print('共传入了 %d 个参数 分别是:' %  number, end = '')
  9.         print(num)
复制代码

正常的调用是
  1. >>> n = Number()
  2. >>> n.cal('I love you!', 'Me too!')
  3. 共传入了 2 个参数 分别是:['I love you!', 'Me too!']
复制代码

我们也可以换个方式
>>> n = Number()
  1. >>> Number.cal(n, 'I love you!', 'Me too!')
  2. 共传入了 2 个参数 分别是:['I love you!', 'Me too!']
复制代码

这回可以看出self代表n了。

2.的确self就是实例化对象n,但n并不等于是num的参数 'I love you!', 'Me too!',这里是对其参数做解析,使用for语句后面是args
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-8 16:04:45 | 显示全部楼层
首先要说明一下,在外面申明了一个对象后。
该对象每次调用一个类方法时,都会事先把   类对象   当作  参数  传进方法里。

self就是类的自身,说白一点,self就是这个类。
嗯,可以这么说,self就是用来接收类对象的参数。
当然self也可以随意取个名字。
如:
class A():
    def a(b):
        print('hehe')

class A():
    def a(self):
        print('hehe')

效果都是一样的。
如果你在方法里不加任何一个参数,对象的类就传不进方法里了,那么在外面就调用不了类的方法。
而对于有许多参数 def function(self, a, b, c),记住,第一个参数永远是用来接收类对象用的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-8 17:41:14 | 显示全部楼层
冬雪雪冬 发表于 2018-7-8 16:06
先说你的程序的问题:
1.函数名与变量名重名(num)
2.变量最好加上self. 这样可以在其它函数中共用。

好的 谢谢   我再琢磨琢磨莫 好像明白了 又好像没明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-8 17:47:46 | 显示全部楼层
小默的世界 发表于 2018-7-8 16:04
首先要说明一下,在外面申明了一个对象后。
该对象每次调用一个类方法时,都会事先把   类对象   当作  参 ...

第一个参数 永远是用来接收对象用的  谢谢  我记住了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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