鱼C论坛

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

[已解决]关于self的问题

[复制链接]
发表于 2020-8-30 12:15:46 | 显示全部楼层 |阅读模式

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

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

x
传不了图片,我想请问一下这个输出不应该是 name创建 的吗
,name在函数的外部
代码:
class Ball:
    name = "name创建的"
    def setname(self,name):
        self.name = name
    def kick(self,name):
        self.name = name
a = Ball()
a.setname("setname创建的")
a.kick("kick创建的")
print(a.name)

输出:
kick创建的
最佳答案
2020-8-30 13:02:07
你的程序中有多个name,分别表示不同的含义
给你写了注释
class Ball:
    name = "name创建的"  #这个是类属性,调用的时候需要写类名:Ball.name
    def setname(self,name):#这个是形参,是个局部变量,只在这个函数中起作用
        self.name = name#前者是实例属性,实例化该类之后,用实例化名调用,例如第10行的a.name。 后者是局部变量,就是上一行的那个形参,是调用该函数的时候传进来的参数 
    def kick(self,name):#这个也是形参,是个局部变量,只在这个函数中起作用
        self.name = name#这里和第四行一样
a = Ball()
a.setname("setname创建的")#括号内的字符串是实参,被传进函数,即第三行的name,然后在第四行用来修改实例化属性self.name
a.kick("kick创建的")#括号内的字符串是实参,被传进函数,即第五行的name,然后在第六行用来修改实例化属性self.name
print(a.name)#这个是实例化属性,即self.name,在上两行被修改了两次,所以这里输出的是最后一次修改后的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 12:19:01 | 显示全部楼层
name 是类属性,被实例属性覆盖了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 12:21:59 | 显示全部楼层
a.kick("kick创建的")

这个不是直接调用了kick的方法么,也传了参数,那不就直接打印出来么

不是把class这段代码从头到尾运行一遍

self就是代表class自身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 13:02:07 | 显示全部楼层    本楼为最佳答案   
你的程序中有多个name,分别表示不同的含义
给你写了注释
class Ball:
    name = "name创建的"  #这个是类属性,调用的时候需要写类名:Ball.name
    def setname(self,name):#这个是形参,是个局部变量,只在这个函数中起作用
        self.name = name#前者是实例属性,实例化该类之后,用实例化名调用,例如第10行的a.name。 后者是局部变量,就是上一行的那个形参,是调用该函数的时候传进来的参数 
    def kick(self,name):#这个也是形参,是个局部变量,只在这个函数中起作用
        self.name = name#这里和第四行一样
a = Ball()
a.setname("setname创建的")#括号内的字符串是实参,被传进函数,即第三行的name,然后在第四行用来修改实例化属性self.name
a.kick("kick创建的")#括号内的字符串是实参,被传进函数,即第五行的name,然后在第六行用来修改实例化属性self.name
print(a.name)#这个是实例化属性,即self.name,在上两行被修改了两次,所以这里输出的是最后一次修改后的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-31 10:03:17 | 显示全部楼层
查找属性有优先级的:
(我自己总结的优先级从高到低 有错误可以指出  按继承顺序就是super的顺序
按继承顺序中各个类的__getattribute__方法
本类的数据描述符属性
本实例属性(obj.__dict__)
本类的非数据描述符属性
按继承顺序各个类的属性和描述符属性(super().__dict__)
按继承顺序各个类的__getattr__方法
还找不到就抛出AttributeError异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 07:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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