[date: 2018-03-20 10:41] [visits: 5]

Python面向对象

模块

以文件为单位组织模块,以目录为单位组织多个模块,目录必须包含__init__.py,用于表示目录本身这个模块,主要知识点:

通过关键词class申明类,class class_name(spuer_class..),可以指定多个父类,方法查找顺序:子类->左父类->右父类。

class Homo(Animal, Monkey):
    name = 'class variable' # 类属性,所有实例共享
    
    def __init__(self): # 初始化函数
        Animal.__init__()
        Monkey.__init__()
        
        print('homo init')
        self.public = 'public' # 公有变量
        self._private_public = 'private_public' # 约定形式的私有变量,外部可访问
        self.__private = 'private' # 私有变量,方法也一样,使用__前缀表示私有
    
    def say_hello(self): # 所有方法第一个参数都为self
        print('hello')

x = Homo() # homo init
x.say_hello() # hello

对象信息

slots

类实例可以动态添加属性和方法,可通过__slots__限制此种行为,类对象也可动态添加属性和方法,对所有实例均有影响,且不受__slots__影响。

class Homo():
    __slots__ = ('name', 'age')

p = Homo()

p.x = 1 # Error

Homo.x = 1;
Homo.x # 1
p.x # 1

继承的子类不受__slots__约束,除非子类本身也申明__slots__属性。

property与setter

通过装饰器方式,声明get/set存取器。

class Homo:
    @property
    def name(self):
        return self._name
    
    @name.setter # 如果没有setter只有property,则表示属性只读
    def name(self, value):
        print('set name')
        self._name = value # 可检查输入有效性

p = Homo()
p.name = 'shasha' # set name
p.name # shasha

__str____repr__

类似toString,定义__str__()__repr__()方法,__str__为print服务,__repr__为调试输出服务。

class Homo:
    def __init__(self):
        self.name = 'shasha'
    
    def __str__(self):
        return 'Home: %s' % self.name
    
    __repr__ = __str__

p = Homo()
p # Home: shasha

__iter____next__

可迭代对象的两个属性,支持这两个方法可被for-in遍历。

class Iterable:
    def __iter__(self):
        return self
    
    def __next__(self):
        return 2;

i = Iterable()
next(i) # 2
next(i) # 2

__getitem__

支持下标访问,或者切片操作

class List_like:
    def __getitem__(self, n):
        if isinstance(n, int):
            return n
        if isinstance(n, slice):
            return [n.start, n.stop]

l = List_like()
l[0] # 0
l[1] # 1

l[1 : 10] # [1, 10]

__getattr__

动态属性获取,当访问实例对象上不存在的属性或方法时,会调用该方法。

class Homo:
    def __getattr__(self, attr):
        return attr

p = Homo()
p.xxx # xxx
p.yyy # yyy

__call__

声明对象callable,可以直接通过实例调用,且可使用callable()函数判断对象是否是callable的。

class Homo:
    def __call__(self):
        print('call __call__')

p = Homo();
p() # call __call__

枚举

from enum import Enum

Type = Enum('Type', ('A', 'B', 'C'))

Type.A == 'A' # False
Type.A == Type.A # True

for name, member in Type.__members__.items():
    print(name, member) # A Type.A

type()

type()函数可用来创建类,python内部遇到类定义时也是通过type()创建类。