鱼C论坛

 找回密码
 立即注册
查看: 2455|回复: 3

class中的def,调用变量,为什么都要加上 self ?

[复制链接]
发表于 2021-5-13 16:43:15 | 显示全部楼层 |阅读模式

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

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

x
各位前辈,我在看python中class的例子的时候,

在class中def,如果调用变量,一定要加上self,这个是什么原理啊?

难道是在def中,通过self,调用上层(class)中的变量?

通过这种办法,也可以在不同def中共享变量?

谢谢大家了!



class people:

    name = ''
    age = 0

    __weight = 0

    def __init__(self,n,a,w):
        self.name = n     # 这个地方一定要加上 self
        self.age = a        # 这个地方一定要加上 self
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-13 18:09:21 | 显示全部楼层
self是类的实例,self.x是实例变量,不在函数内部定义的变量叫类变量。
我觉得你还是看看教程吧,教程解释的比较清楚:https://www.runoob.com/python3/python3-class.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-13 19:56:04 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-5-13 20:07 编辑

其实不用self,也行。
你写个 obj,或写个 zhangsan,lisi  都行。只要你在类里统一用它就行。

为啥行呢?—— 因为它本质是代表 这个类的 一个实例化对象。
既然是个对象,叫啥名实际上不要紧,关键要长得好看。。

当你看见 instance=MyClass() 或 object=MyClass() 时,就是 MyClass这个类的 一种实例化。
但在类定义里,约定俗成 都用 self 来指代 该类的实例化对象。
为啥这样约定俗成?——因为对象名(它自己self),会被传进来,完成初始化(被写到命名空间里...)

self.name, self.xxx 这些带self.修饰的变量,叫【实例变量】。即 某个实例对象所直接拥有的某个属性,都可以在实例化后通过 instance.name 来调用。
没带self,且不在类方法里的,叫 类变量。通常作为公共的,类里都可以访问的变量。但 实例对象会先看自己有没有,再看类变量有没有。
没带self,但在类方法里定义的,叫 局部变量(只作用于该方法内,除非加global关键字)。
特别的,当多个类方法发生嵌套时,会出现“闭包”的概念,和一个叫“自由变量”的概念(特殊的局部变量,即不是一般的局部变量,也不是类变量,也不是实例变量(没带self.)),

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

使用道具 举报

发表于 2021-5-13 21:22:04 | 显示全部楼层
阿奇_o 发表于 2021-5-13 19:56
其实不用self,也行。
你写个 obj,或写个 zhangsan,lisi  都行。只要你在类里统一用它就行。 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 21:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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