鱼C论坛

 找回密码
 立即注册
查看: 1464|回复: 10

[已解决]类的属性无法在方法中调用吗?

[复制链接]
发表于 2017-8-5 16:47:02 | 显示全部楼层 |阅读模式

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

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

x

    class UAV:
            gun = True
            online = True
            offline = False
            boo = 6
            dan = 300
            def __init__(self,x=100,y=100):
                    print('uav online , weapon online')
                    self.x = x
                    self.y = y
                    self.out()
            def move(self,x,y):
                    self.x = self.x + x
                    self.y = self.y + y
                    self.out()
            def kill(self):
                    print('kill he')
                    dan = dan - 100
                    boo = boo - 2
                    self.out()
            def out(self):
                    print('现在位置:x %s||y %s'%(self.x,self.y))
                    print('导弹数量:%s,子弹数量:%s'% (boo,dan))

    class HP(UAV):


uav online , weapon online
现在位置:x 100||y 100
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\新建文件夹\6666666666666.py", line 30, in <module>
    uav = UAV()
  File "C:\Users\Administrator\Desktop\新建文件夹\6666666666666.py", line 11, in __init__
    self.out()
  File "C:\Users\Administrator\Desktop\新建文件夹\6666666666666.py", line 23, in out
    print('导弹数量:%s,子弹数量:%s'% (boo,dan))
NameError: name 'boo' is not defined

>>>
最佳答案
2017-8-5 17:39:47
类属性与实例属性的调用方法都要加 self前缀。

当然类属性还可以直接类名.属性名的方式使用。

需要注意的是如果类属性是个可变类型,当有多个实例且其中一个实例修改了这个属性,那么所有的实例在用这个属性时就都是改变后的内容了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-5 16:51:22 | 显示全部楼层
  1. gun = True
  2.         online = True
  3.         offline = False
  4.         boo = 6
  5.         dan = 300
复制代码

这一对赋值应该放到 __init__中去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-5 16:56:08 | 显示全部楼层
新手·ing 发表于 2017-8-5 16:51
这一对赋值应该放到 __init__中去
这个缩进什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 17:12:13 | 显示全部楼层
本帖最后由 新手·ing 于 2017-8-5 17:50 编辑


那是个错误

看楼下,那是你的另一个错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 17:39:47 | 显示全部楼层    本楼为最佳答案   
类属性与实例属性的调用方法都要加 self前缀。

当然类属性还可以直接类名.属性名的方式使用。

需要注意的是如果类属性是个可变类型,当有多个实例且其中一个实例修改了这个属性,那么所有的实例在用这个属性时就都是改变后的内容了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 18:12:53 | 显示全部楼层
self.boo
self.dan
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 18:56:43 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-8-5 19:18 编辑
wei_Y 发表于 2017-8-5 17:39
类属性与实例属性的调用方法都要加 self前缀。

当然类属性还可以直接类名.属性名的方式使用。


这个才是正解。其他几层都不完全。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 20:12:14 | 显示全部楼层
不是不可以,是你方法错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-5 21:38:46 | 显示全部楼层
wei_Y 发表于 2017-8-5 17:39
类属性与实例属性的调用方法都要加 self前缀。

当然类属性还可以直接类名.属性名的方式使用。

不对吧,是类修改了自身属性,如果实例对象没有覆盖掉属性,那么会修改所有的实例属性.
实例属性修改,只会修改自身的属性,不改变其他实例属性.
114页不是这样说的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-5 21:39:16 | 显示全部楼层
ooxx7788 发表于 2017-8-5 18:56
这个才是正解。其他几层都不完全。

不对吧,是类修改了自身属性,如果实例对象没有覆盖掉属性,那么会修改所有的实例属性.
实例属性修改,只会修改自身的属性,不改变其他实例属性.
114页不是这样说的吗?.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-6 00:39:23 | 显示全部楼层
xiazhianran6 发表于 2017-8-5 21:39
不对吧,是类修改了自身属性,如果实例对象没有覆盖掉属性,那么会修改所有的实例属性.
实例属性修改,只会 ...

说的是可变类型,比如列表这些,如果实例对象往可变的类属性里面添加元素,类属性也会跟着变,应该是这么个意思吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 20:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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