鱼C论坛

 找回密码
 立即注册
查看: 2433|回复: 6

[已解决]有没有大佬解答下哪里有问题呀

[复制链接]
发表于 2023-3-2 10:37:22 | 显示全部楼层 |阅读模式
10鱼币
最佳答案
2023-3-2 10:37:23
w2686867532 发表于 2023-3-2 14:54
感谢大佬 还有个问题是第8行我想添加area进实例的字典,为什么没有成功啊

你 print 的是 Room 这个类的字典,不是实例的字典

你在获取实例的 area 之后打印 r1 的字典就会发现其实已经成功了
class Lazyproperty:
    def __init__(self, func):
        self.func = func
    def __get__(self, instance, owner):
        if instance == None:
            return self
        res = self.func(instance)
        setattr(instance, self.func.__name__, res)
        return instance.area                   # 注意这行

class Room:
    def __init__(self, name, width, length):
        self.name = name
        self.width = width
        self.length = length
    
    @Lazyproperty
    def area(self):
        return self.width * self.length

r1 = Room("客厅", 5, 4)
print(r1.area)
print(r1.__dict__)                            # 注意这里
print(Room.area)
1677724599308(1).jpg

最佳答案

查看完整内容

你 print 的是 Room 这个类的字典,不是实例的字典 你在获取实例的 area 之后打印 r1 的字典就会发现其实已经成功了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-2 10:37:23 | 显示全部楼层    本楼为最佳答案   
w2686867532 发表于 2023-3-2 14:54
感谢大佬 还有个问题是第8行我想添加area进实例的字典,为什么没有成功啊

你 print 的是 Room 这个类的字典,不是实例的字典

你在获取实例的 area 之后打印 r1 的字典就会发现其实已经成功了
class Lazyproperty:
    def __init__(self, func):
        self.func = func
    def __get__(self, instance, owner):
        if instance == None:
            return self
        res = self.func(instance)
        setattr(instance, self.func.__name__, res)
        return instance.area                   # 注意这行

class Room:
    def __init__(self, name, width, length):
        self.name = name
        self.width = width
        self.length = length
    
    @Lazyproperty
    def area(self):
        return self.width * self.length

r1 = Room("客厅", 5, 4)
print(r1.area)
print(r1.__dict__)                            # 注意这里
print(Room.area)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-2 10:42:52 | 显示全部楼层
守株待兔中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-2 11:07:42 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-3-2 11:09 编辑

你打印的 area 是一个方法(函数),而不是他的返回值
另外,要调用实例(就是你代码中的 r1)的方法,就是 r1.area(),而不是类的方法
要不然你得这样写
Room.area(r1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-2 11:10:28 | 显示全部楼层
class Lazyproperty:
    def __init__(self, func):
        self.func = func
    def __get__(self, instance, owner):
        if instance == None:
            return self
        res = self.func(instance)
        setattr(instance, self.func.__name__, res)
        return instance.area                   # 注意这行

class Room:
    def __init__(self, name, width, length):
        self.name = name
        self.width = width
        self.length = length
    
    @Lazyproperty
    def area(self):
        return self.width * self.length

r1 = Room("客厅", 5, 4)
print(Room.__dict__)
print(r1.area)
print(Room.area)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-2 14:54:02 | 显示全部楼层

感谢大佬 还有个问题是第8行我想添加area进实例的字典,为什么没有成功啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-2 14:55:39 | 显示全部楼层
歌者文明清理员 发表于 2023-3-2 11:07
你打印的 area 是一个方法(函数),而不是他的返回值
另外,要调用实例(就是你代码中的 r1)的方法,就 ...

方法area被描述符修饰了啊,应该不用括号吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-2 01:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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