面向对象进阶

类的成员

变量

  实例变量

  类变量

方法

  实例方法   静态方法  类方法

属性

 类的特殊成员:

1. __doc__

表示类的描述信息

class Foo:
    """ 描述类信息 """

    def func(self):
        pass

print Foo.__doc__
#输出:类的描述信息

2__init__

初始化数据,通过类创建对象时,自动触发执行。   类名() 自动执行 

class Foo:

    def __init__(self, name):
        self.name = name
        self.age = 18


obj = Foo('zh') # 自动执行类中的 __init__ 方法

 

3__del__

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

class Foo:

    def __del__(self):
        pass

 

__call__

对象后面加括号,触发执行。   对象() 自动执行

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:

    def __init__(self):
        pass
    
    def __call__(self, *args, **kwargs):

        print '__call__'


obj = Foo() # 执行 __init__
obj()       # 执行 __call__

__dict__

类或对象中的所有成员

            class Foo(object):
                def __init__(self,name,age):
                    self.name = name
                    self.age = age

                def func(self):
                    pass

            obj1 = Foo('aaa',99)
            obj2 = Foo('bbb',89)


            print(obj1.__dict__) # {'name': 'aaa', 'age': 99}
            print(obj2.__dict__) # {'name': 'bbb', 'age': 89}

 

__str__

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:

    def __str__(self):
        return 'zhh'


obj = Foo()
print obj
# 输出:zhh

 

 

7

__getitem__,obj['xx']
__setitem__,obj['xx'] = 1
__delitem__,del obj['xx']

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
class Foo(object):
 
    def __getitem__(self, key):
        print '__getitem__',key
 
    def __setitem__(self, key, value):
        print '__setitem__',key,value
 
    def __delitem__(self, key):
        print '__delitem__',key
 
 
obj = Foo()
 
result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'zhh'   # 自动触发执行 __setitem__
del obj['k1']           # 自动触发执行 __delitem__

 

8__iter__ 

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__ 

 

class Foo(object):
    
    def __iter__(self):
        pass

obj = Foo()

for i in obj:
    print i

# 报错:TypeError: iter() returned non-iterator of type 'NoneType'
View Code
class Foo(object):

    def __init__(self, sq):
        self.sq = sq

    def __iter__(self):
        return iter(self.sq)

obj = Foo([11,22,33,44])

for i in obj:
    print i
View Code

 

class Foo(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def func(self):
        pass

    def __iter__(self):
        # return iter([11,22,33,44,55,66])

        yield 11
        yield 22
        yield 33

 

反射

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:

检查是否含有某成员、获取成员、设置成员、删除成员。

 

class Foo(object):
 
    def __init__(self):
        self.name = 'zhh'
 
    def func(self):
        return 'func'
 
obj = Foo()
 
# #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func')
 
# #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func')
 
# #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1)
 
# #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')

 

posted @ 2018-08-30 14:44  xihuxiangri  阅读(112)  评论(0编辑  收藏  举报