关于Python中type()函数在Property类方法中用法的疑问
关于Python中
type(self)在描述符类中的调用疑问解答 核心结论
type(self)返回的是当前实例所属的类对象,而类对象本身是可调用的构造器,调用它就会生成该类的新实例——这就是它能像原类构造函数一样传参数调用的原因。
逐点解释
type(obj)的真实返回值
你提到的type(l)返回<class 'list'>,这个就是list类本身,而不是你误以为的type类。虽然type(type(l))确实是<class 'type'>(因为Python里所有类都是type的实例),但type(l)拿到的是list这个构造器类,它本身具备创建新实例的能力。类对象的可调用性
在Python中,类对象天生可调用,调用类(比如list([1,2]))会触发类的__call__方法,最终创建并返回该类的新实例。所以type(l)([1,2])完全等价于list([1,2]),自然会输出[1, 2]。文档中
type(self)的设计意图
在模拟的Property类里,用type(self)而不是直接写Property,是为了支持子类继承。假设你定义了MyProperty(Property)子类,当你调用my_prop.setter(...)时,type(self)会返回MyProperty,这样创建的新实例就是子类类型,而非父类Property,保证了类型一致性,是一种更灵活的面向对象写法。
举个简化的代码示例:
class Property: def __init__(self, fget=None, fset=None, fdel=None): self.fget = fget self.fset = fset self.fdel = fdel def setter(self, fset): # 用type(self)创建新实例,适配子类 return type(self)(self.fget, fset, self.fdel) class MyProperty(Property): pass # 创建子类实例 p = MyProperty() # 调用setter后返回的是MyProperty实例,而非Property new_p = p.setter(lambda x: x) print(type(new_p)) # 输出 <class '__main__.MyProperty'>
内容的提问来源于stack exchange,提问作者user21004190
相关产品推荐
相关产品推荐

