23. 面向对象-特殊方法

一、类的特殊成员

1、doc - 表示类的描述信息

class Demo(object):
    """
    我是一个描述,可以通过__doc__来调用
    """

    def func(self):
        pass

demo = Demo
print(demo.__doc__)

>我是一个描述,可以通过__doc__来调用

2、del- 析构方法

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

3、call

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

class Demo(object):
    def __init__(self):
        print("running")

    def __call__(self, *args, **kwargs):
        print("__call__ is running")


# 执行__init__
demo = Demo()
# 执行__call__
demo()

4、dict- 查看类或对象的所有成员

class Demo3:
    author = 'GPF'

    def __init__(self, name, count):
        self.name = name
        self.count = count

    def func(self, *args, **kwargs):
        print('func')


# 获取类的成员,即:静态字段、方法、
print(Demo3.__dict__)
>{'__init__': <function Demo3.__init__ at 0x000002680D43F6A8>, '__dict__': <attribute '__dict__' of 'Demo3' objects>, 'func': <function Demo3.func at 0x000002680D43F730>, 'author': 'GPF', '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Demo3' objects>, '__doc__': None}

# 获取对象 demo3 的成员
demo3 = Demo3('xima', 10000)
print(demo3.__dict__)
>输出:{'count': 10000, 'name': 'xima'}

# 获取对象 demo31 的成员
demo31 = Demo3('jj', 5222)
print(demo31.__dict__)
> 输出:{'count': 5222, 'name': 'jj'}

5、str/repr()

​ 对实例使用repr()时调用。str()和repr()都是返回一个代表该实例的字符串,主要区别在于: str()的返回值要方便人来看,而repr()的返回值要方便计算机看。

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

class Demo(object):
    def __str__(self):
        return "this is String func"

demo = Demo()
print(demo)
> this is String func
class Test:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return "Class_Test[name=" + self.name + ",age=" + str(self.age)+"]"


test = Test("TOM", 90)
print(test)

> Class_Test[name=TOM,age=90]

6、getitem、setitem、delitem

用于索引操作,如字典。以上分别表示获取、设置、删除数据

class Demo(object):
    def __getitem__(self, key):
        print("__getitem__", key)

    def __setitem__(self, key, value):
        print("__setitem__", key, value)

    def __delitem__(self, key):
        print("__delitem__", key)


demo = Demo()
# 自动触发__getitem__
result = demo["keyOne"]
demo["keyTwo"] = "GPD"
del demo["keyOne"]

>__getitem__ keyOne
>__setitem__ keyTwo GPD
>__delitem__ keyOne

7、new和metaclass

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

obj = Foo()

print(type(obj))
print(type(Foo))
> <class '__main__.Foo'>
> <class 'type'>

8、上下文管理

class Point:
    def __init__(self):
        print("init------")

    def __enter__(self):
        print("enter-----")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(1,exc_type)
        print(2,exc_val)
        print(3,exc_tb)
        print("exit-----")
        return "a"

with Point() as p:
    print("in with-----")
    raise Exception("error")
    print("with over")


print("执行完成")

>init------
>enter-----
>in with-----
>1 <class 'Exception'>
>2 error
>3 <traceback object at 0x0000022563581208>
>exit-----
>执行完成
有3个参数如果没有异常,3个参数的值都为None,如果有异常,参数意义如下:

__exit__(self,exc_type,exc_value,exc_tb) 
(1)exc_type #异常类型
(2)exc_value #异常的值
(3)exc_tb #异常的追踪信息
(4)返回值:等效True的值为压制异常;否则,继续抛出异常
posted @ 2020-04-01 12:40  qi.hu  阅读(143)  评论(0编辑  收藏  举报