鱼C论坛

 找回密码
 立即注册
查看: 1959|回复: 5

关于类的几个问题

[复制链接]
发表于 2016-5-18 20:58:16 | 显示全部楼层 |阅读模式
10鱼币
self.inc
这个INC是变量吗
如果是变量的话 预先不进行赋值,为什么能在init方法里面被调用?
之前就不是很理解,越想越不明白

class Ball:
          def func(self.name):
                self.name = name

class Ball:
          def func(self.name):
                self.x = name

class Ball:
          def func(self):
                self.num = 2
这几个有什么区别?
name  self.name  
self.x =name 是什么意思?  self.num = 2呢?
求大神指点啊
MHI_@%]O68]$OY(`L97HPIO.png

最佳答案

查看完整内容

额,再进一步,为了区别,我们修改下代码,把类的属性修改为inc_B 你可以看到如果是ball.inc_B修改了,那么ball1虽然没有直接改,但是输出结果显示ball1.inc_B也修改了,但是ball2.inc_B因为前面已经修改过了,那么输出仍然是前面修改过的"这是ball2的属性" 试着复制代码,运行一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-5-18 20:58:17 | 显示全部楼层
额,再进一步,为了区别,我们修改下代码,把类的属性修改为inc_B
  1. class ball:
  2.     inc_B = "这是一个类属性,每个实例都一样"
  3.     def __init__(self):
  4.         
  5.         self.inc = "这是一个实例属性"
  6.     def func(self,name):
  7.         self.name = name
  8.     def func2(self,name):
  9.         self.x =name

  10.   
  11. ball1 = ball()
  12. ball2 = ball()

  13. ball2.inc_B = "这是ball2的属性"  
  14. print(ball.inc_B)
  15. print(ball1.inc_B)
  16. print(ball2.inc_B)
  17. print("******我是分隔符*******")
  18. ball.inc_B = "这是修改后的属性"
  19. print(ball2.inc_B)
  20. print(ball1.inc_B)
复制代码

你可以看到如果是ball.inc_B修改了,那么ball1虽然没有直接改,但是输出结果显示ball1.inc_B也修改了,但是ball2.inc_B因为前面已经修改过了,那么输出仍然是前面修改过的"这是ball2的属性"
试着复制代码,运行一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-5-18 23:24:27 | 显示全部楼层
在类的定义中,如果直接这样写
  1. class Ball:
  2.     inc = 2
复制代码
这里的inc是类的属性,对所有类的实例,这个inc的值都是一样的
如果是self.inc,就是实例的属性,每个实例的该属性是独立的,可以是完全不一样的。
实例的属性,在初始化的时候赋值,在类的__init__方法就定义了初始化的一些内容,所以可以直接在__init__中应用
  1. class ball:
  2.     inc = "这是一个类属性,每个实例都一样"
  3.     def __init__(self):
  4.         
  5.         self.inc = "这是一个实例属性"
  6.     def func(self,name):
  7.         self.name = name
  8.     def func2(self,name):
  9.         self.x =name

  10.   
  11. ball1 = ball()
  12. ball2 = ball()

  13. ball2.inc = "这是ball2的属性"  
  14. print(ball.inc)
  15. print(ball1.inc)
  16. print(ball2.inc)
复制代码

看看输出什么?
    这是一个类属性,每个实例都一样
    这是一个实例属性
    这是ball2的属性
为什么ball2.inc输出变了,因为前面改变了它,但是ball1.inc没有改啊,这就是实例属性。
另外,我们定义了func和func2,区别在于一个是self.name=name ,一个是self.x=name
那么接下来
  1. ball1.func("ball1")
  2. ball2.func2("ball2")
  3. print(ball1.name)
  4. print(ball2.x)
复制代码

会输出什么?
   ball1
   ball2
如果使用print(ball2.name)呢?试一试。
我想这样你应该理解了,self.name=name定义的是类实例中的name属性,self.x=name定义的是x属性,而函数func(self,name)中的那么,是参数,只不过为了好理解程序,正好命名和属性名一样啦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-5-18 23:38:55 | 显示全部楼层
输出结果如下:
这是一个类属性,每个实例都一样
这是一个类属性,每个实例都一样
这是ball2的属性
******我是分隔符*******
这是ball2的属性
这是修改后的属性

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
竟无语凝噎 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-5-19 09:42:44 | 显示全部楼层
vpo1 发表于 2016-5-18 23:38
输出结果如下:
这是一个类属性,每个实例都一样
这是一个类属性,每个实例都一样

谢谢您的解答,十分感谢。
感觉就像全局变量与局部变量之间的关系似得
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-19 09:43:37 | 显示全部楼层

wu

本帖最后由 竟无语凝噎 于 2016-5-19 09:45 编辑
vpo1 发表于 2016-5-18 23:38
输出结果如下:
这是一个类属性,每个实例都一样
这是一个类属性,每个实例都一样


谢谢 您看能在举一个类方法的例子吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 02:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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