Python对象属性进阶学习笔记
目录
-
更多分享:http://www.catbro.cn
-
我们在前面了解过访问器,访问器是一个简单的方法,它能够使用getXXX和setXXX这样的名字来得到或者重绑定一些特性。
-
使用访问器的场景一般是:在访问给定的特性时需要执行一些代码
@property装饰器(demo例子,创建一个矩形类)
-
实例代码:
class Rectangle: def __init__(self): self.width = 0; self.height = 0; def setSize(self,size): self.width,self.height = size; def getSize(self): return self.width,self.height
-
调用:
r = Rectangle(); print(r.getSize()) r.setSize((2,3)) print(r.getSize())
-
输出:
(0, 0) (2, 3)
-
当然,我们也可以使用新特性来处理该需求
-
主角是@property注解
class Rectangle: def __init__(self): print('init be called') self.width = 0; self.height = 0; @property def size(self): return self.size; @size.setter def size(self,size): print('setSize be called') self.width,self.height = size; @size.getter def size(self): print('getSize be called') return self.width,self.height @size.deleter def size(self): print('delete be called')
-
调用:
r = Rectangle(); r.size =1,2 print(r.size); del r.size;
-
输出:
init be called setSize be called getSize be called (1, 2) delete be called
-
可以看到,我额外加了个delete,通过del语句删除size就会调用,其实property提供了四个参数,分别为: 1、fget:设置访问器 2、fset:设置设计器 3、fdel:设置删除器 4、doc:返回说明文档
-
如果我们四个参数都没有相应的设置,该属性就是不可读,不可写
-
@property
广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。 -
所以小伙伴们在定义类的时候可以优先考虑@property哦。
静态方法和类成员方法@staticmethod和 @classmethod
-
实例代码:
class MyClass: @staticmethod def method1(): print('this is static method'); @classmethod def method2(cls): print('this is class method of ',cls);
-
调用如下:
MyClass.method1(); MyClass.method2();
-
实际上,静态方法在创建时被装入Staticmethod类型的对象中,静态方法没有self,也没有class,能够被类本身直接调用,当然也可以被对象实例调用
-
类方法在创建的时候被装如Classmethod类型的对象中,类方法在定义时需要名为cls的参数,cls和self类型,会自动绑定当前的类。同样可以被类和类实例调用