>[success] # 通过定义一个新类,来定义另一个类的参数 ~~~ 1.定义一个Integer 类用来专门判断Point 属性是否是int 类型 2.在定义的Integer 之定义了一个name 属性,通过传入不同的变量值,其中instance 是指得使用的对象下案例中的Point, 来看下面案例中的属性有没有被定义,有就给这个属性赋值 3.其中get 方法判断None 返回self 类型平常我们没有给属性赋值返回一个地址 4.创建了一个类的实例化,x,y 分别是这个类的对象 在类直接创建的方法 是类方法,可以通过对象调用也就是这里面的x 等同于 self.x self.x 也就是这个对象的,然后给这个对象进行赋值操作执行对象的__set__ 等方法 ~~~ >[danger] ##### 代码 ~~~ # Descriptor attribute for an integer type-checked attribute class Integer: def __init__(self, name): self.name = name def __get__(self, instance, cls): print(instance) # <__main__.Point object at 0x0000023C6ABFF160> if instance is None: return self else: return instance.__dict__[self.name] def __set__(self, instance, value): if not isinstance(value, int): raise TypeError('Expected an int') instance.__dict__[self.name] = value def __delete__(self, instance): del instance.__dict__[self.name] class Point: # 创建了一个类的实例化,x,y 分别是这个类的对象 # 在类直接创建的方法 是类方法,可以通过对象调用也就是这里面的x 等同于 self.x # self.x 也就是这个对象的,然后给这个对象进行赋值操作执行对象的__set__ 等方法 x = Integer('x') y = Integer('y') def __init__(self, x, y): self.x = x self.y = y x = Integer('x') p = Point(2, 3) print(p.x) 打印结果: p = Point(2, 3) p.x # Calls Point.x.__get__(p,Point) 2 p.y = 5 # Calls Point.y.__set__(p, 5) # 小数报错 p.x = 2.3 # Calls Point.x.__set__(p, 2.3) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "descrip.py", line 12, in __set__ raise TypeError('Expected an int') TypeError: Expected an int ~~~