字段、方法、属性
- 注意问题:
- pickle,load报错:
- 场景:A文件中定义了class,在B文件中load报错
- 原因:B中没有A中定义的class,需要 from A import class
一、面向对象 python 类成员
1、字段:
- example:
class Province:country = 'CN' //静态字段,保存在类中def __init__(self,name):self.name = name //动态字段,保存在对象中
hn = Province('河南')sx = Province('陕西')
- 图示:
- 静态字段:
- 位置:保存在类中,一般将所有对象相同的字段(即实现知道,所有对象的该字段值都一样)放在类中
- 数量:在类中保存一份
- 引用:通过类进行访问,Class.var_name
- 动态字段:
- 位置:保存在对象中
- 数量:在每个对象中保存一份
- 访问:通过对象访问,obj.var_name
- 注意:
- 何时创建字段:
- 静态字段,代码加载是会直接存储在内存中,
- 动态字段,实际上是方法(函数)内部变量,只有真正调用该方法时才会创建存储
2、方法
- 方法中对字段的引用问题说明:
- python 支持3种方法,所有方法均属于类
- 调用方式图解
- 普通方法:
- 参数:至少一个self
- 调用:由对象调用执行
- 静态方法:
- 参数:没有self参数,0个或多个用户自定义参数
- 调用:由类调用执行
- 解释:
- 写在类中只是为了说明该方法和这个类是相关的
- 没有使用到动态字段的方法(即该方法跟对象没有什么关系,对象自身只存了动态字段) 就可以定义为静态方法,通过类来直接调用
- 类方法:
- 参数:至少一个cls
- 调用:由类调用执行
- 解释:
- 只是比静态方法多传了一个cls形参,自动将类的名称传递给cls(不是str类型,是class类型)
- example:
class Province:country = 'CN'
def __init__(self,name):self.name = name# 普通方法def show(self):print(self.name)# 静态方法@staticmethoddef f1(arg): //没有self参数,有用户参数arg,可以有多个# 类方法print('xxxx',arg)@classmethoddef function(cls): //至少要有一个cls参数,可以有N个用户参数arg
pass
# 动态方法,对象去调用执行obj = Province('shanxi')obj.show()# 静态方法,类去调用执行Province.f1('qiaogy')# 类方法,类调用执行Province.function() //python会自动讲该“类名称”传递给cls参数
3、属性:
- 解释:
- 不伦不类的东西,可以通过“操作字段”的方式,调用相应的函数
- 实则是 python提供的一种关联关系,即若用户执行了“字段的操作”,则可以执行相应的方法,具体方法中做什么事情可以自定义
- 属性有2中表示形式:装饰器、property函数
- 通过装饰器表示关联关系
class Pager:def __init__(self,all_count):self.all_count = all_count
@property # 可以不加括号调用def function1(self):pass
@function1.setter # 可以赋值调用,因为是赋值,所以必须要有参数接收值def all_pager(self,value):pass
@function1.deleter # 可以删除调用def all_pager(self):pass
# 实例化对象,并通过属性进行方法调用obj = Pager(101)obj.all_pager # 类似访问字段的样子,调用相应的方法,(访问字段没有括号)obj.all_pager = 111 # 类似字段赋值的方式,调用相应的方法,且将值传给函数的形参del obj.all_pager # 类似字段删除的方式,调用相应的方法
- 通过property函数定义关联关系
- property 构造函数:
- 格式:
- bind = property(fget=方法名1, fset=方法名2, fdel=方法名3 )
- 参数:
- fget: 当调用 对象.bind 时,会自动执行指定方法
- fset: 当调用 对象.bind = 'xxx' 时, 会自动执行指定方法
- fdel: 当调用 del 对象.bind 时,会自动执行指定方法
class Pager:def __init__(self,all_count):self.all_count = all_count# 三个方法def f1(self):passdef f2(self,value):passdef f3(self):pass# 创建属性关联关系,相当于对property函数传关键字参数foo = property(fget=f1, fset=f2, fdel=f3)
# 实例化对象,并通过属性进行方法调用p = Pager(101)p.foo # 通过foo字段规定的属性关系中找 fget指向的函数名,并执行该函数 (若有返回值,可接受,比如ret = p.foo)p.foo = '111' # 通过foo字段规定的属性关系中找 fset 指向的函数名,并执行该函数del p.foo # 通过foo字段规定的属性关系中找fdel指向的函数名,并执行该函数
类成员之成员修饰符
四、成员修饰符
五、特殊成员
__init__
__doc__
__call__
__setitem__
...
六、边缘知识
isinstance
issubclass
2.7 中的继承
应用:
自定义类型:有序字典
源码的扩展:思路,
七、异常处理
八、设计模式之单例模式