Python面向对象
模块
以文件为单位组织模块,以目录为单位组织多个模块,目录必须包含__init__.py
,用于表示目录本身这个模块,主要知识点:
- 任何模块代码的第一个字符串都被视为模块的文档注释
- 通过python直接执行代码时,模块内
__name__
变量值为__main__
- 正常的变量在其他模块引入时都可访问,约定
_
开头的变量名是私有变量,外部不应该使用,函数也是变量- 通过import引入模块
- 使用pip管理第三方模块
类
通过关键词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
对象信息
type()函数,返回类名信息
isinstance()函数,是否是某种类型的实例,适用于继承关系
dir()函数,获取对象包含的所有属性和方法
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()创建类。