目录

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类型,会自动绑定当前的类。同样可以被类和类实例调用