w2686867532 发表于 2023-3-2 10:37:22

有没有大佬解答下哪里有问题呀

isdkz 发表于 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)

w2686867532 发表于 2023-3-2 10:42:52

守株待兔中

歌者文明清理员 发表于 2023-3-2 11:07:42

本帖最后由 歌者文明清理员 于 2023-3-2 11:09 编辑

你打印的 area 是一个方法(函数),而不是他的返回值
另外,要调用实例(就是你代码中的 r1)的方法,就是 r1.area(),而不是类的方法
要不然你得这样写
Room.area(r1)

isdkz 发表于 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)

w2686867532 发表于 2023-3-2 14:54:02

isdkz 发表于 2023-3-2 11:10


感谢大佬 还有个问题是第8行我想添加area进实例的字典,为什么没有成功啊

w2686867532 发表于 2023-3-2 14:55:39

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

方法area被描述符修饰了啊,应该不用括号吧
页: [1]
查看完整版本: 有没有大佬解答下哪里有问题呀