鱼C论坛

 找回密码
 立即注册
查看: 1796|回复: 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 的字典就会发现其实已经成功了
  1. class Lazyproperty:
  2.     def __init__(self, func):
  3.         self.func = func
  4.     def __get__(self, instance, owner):
  5.         if instance == None:
  6.             return self
  7.         res = self.func(instance)
  8.         setattr(instance, self.func.__name__, res)
  9.         return instance.area                   # 注意这行

  10. class Room:
  11.     def __init__(self, name, width, length):
  12.         self.name = name
  13.         self.width = width
  14.         self.length = length
  15.    
  16.     @Lazyproperty
  17.     def area(self):
  18.         return self.width * self.length

  19. r1 = Room("客厅", 5, 4)
  20. print(r1.area)
  21. print(r1.__dict__)                            # 注意这里
  22. 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 的字典就会发现其实已经成功了
  1. class Lazyproperty:
  2.     def __init__(self, func):
  3.         self.func = func
  4.     def __get__(self, instance, owner):
  5.         if instance == None:
  6.             return self
  7.         res = self.func(instance)
  8.         setattr(instance, self.func.__name__, res)
  9.         return instance.area                   # 注意这行

  10. class Room:
  11.     def __init__(self, name, width, length):
  12.         self.name = name
  13.         self.width = width
  14.         self.length = length
  15.    
  16.     @Lazyproperty
  17.     def area(self):
  18.         return self.width * self.length

  19. r1 = Room("客厅", 5, 4)
  20. print(r1.area)
  21. print(r1.__dict__)                            # 注意这里
  22. 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(),而不是类的方法
要不然你得这样写
  1. Room.area(r1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

  10. class Room:
  11.     def __init__(self, name, width, length):
  12.         self.name = name
  13.         self.width = width
  14.         self.length = length
  15.    
  16.     @Lazyproperty
  17.     def area(self):
  18.         return self.width * self.length

  19. r1 = Room("客厅", 5, 4)
  20. print(Room.__dict__)
  21. print(r1.area)
  22. 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, 2024-5-7 14:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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