鱼C论坛

 找回密码
 立即注册
查看: 1778|回复: 17

[已解决]为什么这个程序不会打印m.x和m1.x的值?

[复制链接]
发表于 2021-8-14 14:11:22 | 显示全部楼层 |阅读模式
10鱼币
class RevealAccess:
    def __init__(self,initval = None,name='var'):
        self.val = initval
        self.name = name

    def __get__(self, instance, owner):
        print("获取..",self.name)
        return self.val

    def __set__(self, instance, value):
        print("设置值:",self.name)
        self.val = value

class MyClass:
    x = RevealAccess(10,"var 'x'")
    y = 5
    def __init__(self):
        self.x = 'self x'
   
m = MyClass()
m.x
print("-----------------")
m1 = MyClass()
m1.x = 20
m1.x

程序执行结果:
设置值: var 'x'
获取.. var 'x'
-----------------
设置值: var 'x'
设置值: var 'x'
获取.. var 'x'
最佳答案
2021-8-14 14:11:23
在shell里输入变量会回显变量,如果是跑程序,得print。
m = MyClass()
print(m.x)
print("-----------------")
m1 = MyClass()
m1.x = 20
print(m1.x)

最佳答案

查看完整内容

在shell里输入变量会回显变量,如果是跑程序,得print。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 14:11:23 | 显示全部楼层    本楼为最佳答案   
在shell里输入变量会回显变量,如果是跑程序,得print。
m = MyClass()
print(m.x)
print("-----------------")
m1 = MyClass()
m1.x = 20
print(m1.x)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 15:32:03 | 显示全部楼层
suchocolate 发表于 2021-8-14 15:29
在shell里输入变量会回显变量,如果是跑程序,得print。

OK,那还有第二个m1.x为什么会有两个设置值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 15:44:03 | 显示全部楼层
本帖最后由 suchocolate 于 2021-8-14 15:45 编辑
飞花落尽 发表于 2021-8-14 15:32
OK,那还有第二个m1.x为什么会有两个设置值?


初始对象时,为类变量x赋值调用一次描述符__set__,m1.x=20又调用一次__set__。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 16:12:41 | 显示全部楼层
suchocolate 发表于 2021-8-14 15:44
初始对象时,为类变量x赋值调用一次描述符__set__,m1.x=20又调用一次__set__。

那实例化对象的赋值‘self x’不用调用吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 16:17:27 | 显示全部楼层
suchocolate 发表于 2021-8-14 15:44
初始对象时,为类变量x赋值调用一次描述符__set__,m1.x=20又调用一次__set__。

class RevealAccess:
    def __init__(self,initval = None,name='var'):
        self.val = initval
        self.name = name

    def __get__(self, instance, owner):
        print("获取..",self.name)
        return self.val

    def __set__(self, instance, value):
        print("设置值:",self.name)
        self.val = value
    def __delete__(self,instance):
        del self.val

class MyClass:
    x = RevealAccess(10,"var 'x'")
    y = 5
    def __init__(self):
        self.x = 'self x'
   
m = MyClass()
print(m.x)
print("-----------------")
m1 = MyClass()
m1.x = 20
del m1.x
print(m1.x)

还有我删除实例化对象的x属性,类属性x是否会被保留?(运行结果AttributeError: 'RevealAccess' object has no attribute 'val')但我记得类属性好像不会被删除啊,希望大佬解释一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 16:25:29 | 显示全部楼层
飞花落尽 发表于 2021-8-14 16:12
那实例化对象的赋值‘self x’不用调用吗?

调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 16:31:10 | 显示全部楼层

那怎么不打印语句?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 16:40:19 | 显示全部楼层
飞花落尽 发表于 2021-8-14 16:17
class RevealAccess:
    def __init__(self,initval = None,name='var'):
        self.val = initval ...

1.不是同一个东西,不影响。
2.可以删除,想不被删除用__开头。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 16:41:17 | 显示全部楼层
本帖最后由 suchocolate 于 2021-8-14 16:57 编辑
飞花落尽 发表于 2021-8-14 16:31
那怎么不打印语句?

class RevealAccess:
    def __init__(self,initval = None,name='var'): # 初始化运行,有设置值,自动调用__set__,会打印。
        self.val = initval
        self.name = name

    def __get__(self, instance, owner):
        print("获取..",self.name)
        return self.val

    def __set__(self, instance, value): # 对象变量被设置时自动调用,会打印。
        print("设置值:",self.name)
        self.val = value
    def __delete__(self,instance):
        del self.val

class MyClass:
    x = RevealAccess(10,"var 'x'")# 初始化实例时运行,调用描述符类。
    y = 5
    def __init__(self):   # 初始化实例时运行,没有打印的东西。
        self.x = 'self x'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 19:54:51 | 显示全部楼层
suchocolate 发表于 2021-8-14 16:40
1.不是同一个东西,不影响。
2.可以删除,想不被删除用__开头。

我的意思是我用del这个函数删除的是类属性的x还是实例化属性的x?
抱歉,上面可能表达得不是很清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 20:09:06 | 显示全部楼层
飞花落尽 发表于 2021-8-14 19:54
我的意思是我用del这个函数删除的是类属性的x还是实例化属性的x?
抱歉,上面可能表达得不是很清楚

del MyClass.x  # 删除类属性
del m1.x  # 删除实例属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 21:42:08 | 显示全部楼层
suchocolate 发表于 2021-8-14 20:09
del MyClass.x  # 删除类属性
del m1.x  # 删除实例属性

那删除了实例属性不也可以通过m1.x访问类属性吗?但是上面的结果报错了是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 21:47:12 | 显示全部楼层
本帖最后由 suchocolate 于 2021-8-14 21:50 编辑
飞花落尽 发表于 2021-8-14 21:42
那删除了实例属性不也可以通过m1.x访问类属性吗?但是上面的结果报错了是为什么呢?


MyClass.x   类属性
m1.x 实例属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 22:00:20 | 显示全部楼层
suchocolate 发表于 2021-8-14 21:47
MyClass.x   类属性
m1.x 实例属性

啊这
举个例子吧
class Turtle:
    color = 'green'
    def __init__(self):
        self.color = "black"

运行:
t= Turtle()
>>> t.color
'black'
>>> del t.color
>>> t.color
'green'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-14 22:01:07 | 显示全部楼层
suchocolate 发表于 2021-8-14 21:47
MyClass.x   类属性
m1.x 实例属性

这样就不会报错啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-15 11:20:54 | 显示全部楼层

print和shell是不同的,__str__ 控制printi行为 , __repr__控制shell回显行为,这两个函数不同,想避免报错就自定义这两个函数,不用默认的行为。
其次对象变量尽量不要和类变量同名。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-15 11:29:08 | 显示全部楼层
suchocolate 发表于 2021-8-15 11:20
print和shell是不同的,__str__ 控制printi行为 , __repr__控制shell回显行为,这两个函数不同,想避免 ...

好的,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 19:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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