字段、方法、属性

 

  • 注意问题:
    • 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个或多个用户自定义参数
      • 调用:由类调用执行
      • 解释:
        1. 写在类中只是为了说明该方法和这个类是相关的
        2. 没有使用到动态字段的方法(即该方法跟对象没有什么关系,对象自身只存了动态字段) 就可以定义为静态方法,通过类来直接调用
    • 类方法:
      • 参数:至少一个cls
      • 调用:由类调用执行
      • 解释:
        1. 只是比静态方法多传了一个cls形参,自动将类的名称传递给cls(不是str类型,是class类型)
  • example:
class Province:
country = 'CN' 

def __init__(self,name):
self.name = name
# 普通方法
def show(self):
print(self.name)
# 静态方法
@staticmethod     
def f1(arg):           //没有self参数,有用户参数arg,可以有多个
print('xxxx',arg)
# 类方法
@classmethod
def 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):
pass
def f2(self,value):
pass
def 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 中的继承
        应用:
                自定义类型:有序字典
                源码的扩展:思路,

七、异常处理
八、设计模式之单例模式

 

posted on 2016-08-29 16:54  台灯不太亮  阅读(271)  评论(0编辑  收藏  举报

导航