|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 松V溪 于 2023-8-1 15:35 编辑
- class Age:
- def __get__(self, obj, objtype=None):
- if obj.name == 'zhangsan':
- return 20
- elif obj.name == 'lisi':
- return 25
- else:
- return ValueError("unknow")
- class Person:
- age = Age()
- def __init__(self, name):
- self.name = name
- p1 = Person('zhangsan')
- print(p1.age) # 20
- p2 = Person('lisi')
- print(p2.age) # 25
- p3 = Person('wangwu')
- print(p3.age) # unknow
复制代码
请问一下:
1,Python中魔法方法的触发条件是什么?
2,魔法方法和描述符之间有什么关系?
3,上面代码中我明明没有在Age里面定义obj对象,为什么还是可以对obj.name属性进行操作?
快来救救孩子吧
你的代码中使用了描述符(descriptor)和类的魔法方法(magic method)。描述符是一种用于实现属性访问控制的协议,而魔法方法是在类中定义特殊行为的方法。
在你的代码中, Age是一个描述符类,实现了 __get__方法。 Person类中的 age属性是一个 Age实例。当你访问 p1.age时,会调用 Age类的 __get__方法,并传递 self( p1对象)作为参数。根据 self.name的不同取值, __get__方法返回相应的年龄。
下面是修正后的代码:
- class Age:
- def __get__(self, obj, objtype=None):
- if obj.name == 'zhangsan':
- return 20
- elif obj.name == 'lisi':
- return 25
- else:
- raise ValueError("unknown")
- class Person:
- age = Age()
- def __init__(self, name):
- self.name = name
- p1 = Person('zhangsan')
- print(p1.age) # 输出:20
- p2 = Person('lisi')
- print(p2.age) # 输出:25
- p3 = Person('wangwu')
- print(p3.age) # 引发 ValueError 异常,输出:unknown
复制代码
修正后的代码中,当 self.name为 'zhangsan'时, __get__方法返回 20;当 self.name为 'lisi'时,返回 25;否则,引发 ValueError异常。
请注意,描述符还有其他方法,如 __set__和 __delete__,用于实现属性的赋值和删除操作。你可以根据需要来实现这些方法。
如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
|
|