鱼C论坛

 找回密码
 立即注册
查看: 2071|回复: 6

求助,实在理解不了self用法

[复制链接]
发表于 2017-12-13 21:20:10 | 显示全部楼层 |阅读模式

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

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

x
  1. class Ball:
  2.         def setname(self,name):
  3.                 self.name=name
  4.         def kick(self):
  5.                 print('我叫%s,该死的,谁踢我...'%self.name)
  6. a=Ball()
  7. a.setname('球A')
  8. a.kick()
复制代码


这个程序中为什么要  self.name = name   有什么作用?


  1. class Ticket():
  2.         def __init__(self, weekend=False, child=False):
  3.                 self.exp = 100
  4.                 if weekend:
  5.                         self.inc = 1.2
  6.                 else:
  7.                         self.inc = 1
  8.                 if child:
  9.                         self.discount = 0.5
  10.                 else:
  11.                         self.discount = 1
  12.         def calcPrice(self, num):
  13.                 return self.exp * self.inc * self.discount * num

  14. >>> adult = Ticket()
  15. >>> child = Ticket(child=True)
  16. >>> print("2个成人 + 1个小孩平日票价为:%.2f" % (adult.calcPrice(2) + child.calcPrice(1)))
  17. 2个成人 + 1个小孩平日票价为:250.00
复制代码


而37课课后题答案中  num  为什么不用self.num。 也不用写一句 self.num = num
请大家帮忙回答一下,谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-12-13 21:32:18 | 显示全部楼层
self 表示自身。self.后面都表示该模块的变量和方法。
也就是说模块内部所有的方法的属性都要加self。没加一般可以理解为外面传进来的。

a=Ball()
a.setname('球A')
a.kick()

b=Ball()
b.setname('球B')
b.kick()
看上面2个实列化后的对象 a, b  在模块内self.name 就是 a.name  和 b.name 。self就是用来区分哪个是哪个的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 07:00:36 | 显示全部楼层
self就是指实例化对象本身
self.name指的是这个实例化对象在实例化后会拥有的属性(必须先调用这个方法)
而上面没有加的是方法的参数……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-14 09:32:55 | 显示全部楼层
timeislife 发表于 2017-12-14 07:00
self就是指实例化对象本身
self.name指的是这个实例化对象在实例化后会拥有的属性(必须先调用这个方法)
...

可否这样理解,需要在所有方法里都用到的变量或者参数,需要加self。
只在一个方法里用的参数或者变量就不用加self了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-14 10:34:19 | 显示全部楼层
ba21 发表于 2017-12-13 21:32
self 表示自身。self.后面都表示该模块的变量和方法。
也就是说模块内部所有的方法的属性都要加self。没加 ...


方法中的变量 不加self.也可以,下面这个就能运行
class Rectangle:
    def getRect(self):
        length = 5
        width = 4
        print('这个矩形的长是:%d,宽是:%d' % (length, width))

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 10:43:59 | 显示全部楼层
yuzhouyichen 发表于 2017-12-14 10:34
方法中的变量 不加self.也可以,下面这个就能运行
class Rectangle:
    def getRect(self):


self 表示自身。self.后面都表示该模块的变量和方法。
也就是说模块内部所有的方法的属性都要加self。没加一般可以理解为外面传进来的。

a=Ball()
a.setname('球A')
a.kick()

b=Ball()
b.setname('球B')
b.kick()
看上面2个实列化后的对象 a, b  在模块内self.name 就是 a.name  和 b.name 。self就是用来区分哪个是哪个的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-14 18:07:26 | 显示全部楼层
yuzhouyichen 发表于 2017-12-14 10:34
方法中的变量 不加self.也可以,下面这个就能运行
class Rectangle:
    def getRect(self):

这个是局部变量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-27 19:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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