跳转至

面向对象

基本

  • 支持多继承
  • 使用super函数调用父类的方法
    • super(type[, object or type]).method(parameters)
  • 类属性与方法
    • 使用两个下划线声明该属性或方法为私有
      • 私有属性:__private_attris
      • 私有方法:__private_method
  • 支持运算符重载

动态语言

  • Python类型的动态性使得我们可以动态为自定义类及其对象增加新的属性和行为,称为混入机制
  • types.MethodType(method, object) 用户自定义类实例方法的类型
    import types
    class Person(object):
        def __init__(self, name):
            assert isinstance(name, str)
            self.name = name
    
    def sing(self):
        print('sing something')
    
    def walk(self):
        print('walk')
    
    if __name__=='__main__':
        zhang = Person('zhang')
        # add a new method to the object dynamically
        zhang.sing = types.MethodType(sing, zhang)
        zhang.walk = types.MethodType(walk, zhang)
        # delete a method from the object
        del zhang.walk
    
  • 函数与方法的区别:方法指与特定实例绑定的函数,通过对象对用方法时,对象本身将被作为第一个参数隐式传递,而普通函数则不具备这个特点
class Demo:
    pass

t = Demo()
def test(self, v):
    self.value = v

t.test = test
t.test            #common method
t.test(t, 3)      #must transfer a value to the parameter self

t.test = types.MethodType(test, t)
t.test
t.test(5)         # do not need to transfer a value to the parameter self, it will be transfered automatically

@property装饰器

  • 使用@property包装器来包装getter方法,使对属性的访问既安全又方便
  • 使用方法名.setter装饰器来包装setter方法
    class p:  
        def __init__(self, x=0, y=0):  
            self.__x = x  
            self.__y = y  
    
        # read only
        @property  
        def x(self):  
            return self.__x  
    
        @property  
        def y(self):  
            return self.__y  
    
        @x.setter  
        def x(self, value):  
            self.__x = value  
    
        @y.setter  
        def y(self, value):  
            self.__y = value  
    
        def __str__(self):  
            return '(%s, %s)' % ((str(self.__x)), str(self.__y))  
    
    
    def main():  
        p1 = p(37, 39)  
        print(p1)  
        p1.x = 7  
        p1.y = 9  
        print(p1)  
        print(p1.x, p1.y)  
    
    
    if __name__ == '__main__':  
        main()
    

__slots__

  • Python是一门动态语言,允许我们在程序运行时给对象绑定新的属性或方法,同时也可以进行解绑定
  • 我们可以使用__slots__来限定对象只能绑定某些属性
  • __slots__只对当前的类生效,对子类不起作用
  • __slots__ = ('name', 'gender', 'age')

静态方法

  • 缺少selfcls这样的特殊参数
  • 需要使用@staticmethod修饰

类方法

  • 代表的是当前类相关的信息的对象

    类本身也是一个对象,称之为类的元数据对象

  • 类方法的第一个参数约定名为cls
    • 通过这个参数,我们可以获取和类像个的信息并且可以创建出类的对象
  • 需要使用@classmethod修饰
    from time import time, localtime, sleep  
    
    class Clock:  
        def __init__(self, sec, min, h):  
            self.sec = sec  
            self.min = min  
            self.h = h  
    
        @classmethod  
        def now(cls):  
            ctime = localtime(time())  
            return cls(ctime.tm_sec, ctime.tm_min, ctime.tm_hour)
    

类之间的关系

  • 类之间存在三种关系:
    • is-a
      • 关系:继承或泛化
      • 例:学生与人
    • has-a
      • 关系:关联
      • 例:部门与员工
    • use-a
      • 关系:依赖
      • 例:司机-驾驶-汽车