面向对象day08:类的特殊成员-类的起源与metaclass

Posted python运维自动化之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象day08:类的特殊成员-类的起源与metaclass相关的知识,希望对你有一定的参考价值。

本节内容

1、__doc__
2、__module__和__class__
3、__init__
4、__del__
5 、__call__
6 、__dict__
7 、__str__
8 、__getitem__、__setitem__、__delitem__

 

  前面我们讲了类的方法,有普通方法,就是我们自己定义的方法,还有静态方法,类方法,属性方法,其实类还有另外一种方法,叫做类的特殊成员方法

1 __doc__

说明:表示类的描述信息

1
2
3
4
5
6
7
8
9
10
11
class Dog(object):
    """此类是形容Dog这个类"""    #类的描述信息
 
    def __init__(self,name):
        self.name = name
 
 
print(Dog.__doc__)   #打印类的描述信息
 
#输出
此类是形容Dog这个类

2 __module__和__class__

说明:

  1. __module__: 表示当前操作的对象在哪个模块
  2. __class__:表示当前操作的对象的类是什么

aa.py的代码:

1
2
3
4
class C(object):
 
    def __init__(self):
        self.name = "shuaigaogao"

index.py的代码:

1
2
3
4
5
6
7
8
9
10
from lib.aa import C
 
obj = C()
 
print(obj.__module__) #表示当前操作的对象在哪个模块
print(obj.__class__)  #表示当前操作的对象的类是什么
 
#输出
lib.aa
<class \'lib.aa.C\'>

3 __init__

说明:构造方法,通过类创建对象时,自动触发执行

4 __del__

说明:析构方法,当对象在内存中被释放时,自动触发执行

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

5 __call__

说明: 对象后面加括号,触发执行

1
2
3
4
5
6
7
8
9
10
11
12
class Foo(object):
    def __init__(self):
        self.name = "shuaigaogao"
 
    def __call__(self*args, **kwargs):  #重写call方法
        print("running call",args,kwargs)
 
= Foo()   #执行__init__
f(1,2,3,name=333)  # 执行call方法,也可以写成 Foo()(1,2,3,name=333)
 
#输出
running call (123) {\'name\'333}

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

6 __dict__

说明: 查看类或对象中的所有成员

①类.__dict__

效果:打印类中所有的属性,不包括实例属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Province(object):
 
    country = \'China\'
 
    def __init__(self, name, count):
        self.name = name
        self.count = count
 
    def func(self*args, **kwargs):
        print("func")
 
print(Province.__dict__) #类.__dict__
 
#输出
{\'__doc__\'None\'__weakref__\': <attribute \'__weakref__\' of \'Province\' objects>, \'__init__\':
<function Province.__init__ at 0x00000247F3CAD488>, \'country\'\'China\'\'__dict__\':
<attribute \'__dict__\' of \'Province\' objects>, \'func\': <function Province.func at
0x00000247F3CAD510>, \'__module__\'\'__main__\'}  #打印类中所有的属性,不包括实例属性

②实例名.__dict__

效果:打印该实例的所有属性,不包括类属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Province(object):
 
    country = \'China\'
 
    def __init__(self, name, count):
        self.name = name
        self.count = count
 
    def func(self*args, **kwargs):
        print("func")
 
= Province("jiangsu",20000)  #实例化
print(p.__dict__) #实例名.__dict__
 
#输出
{\'count\'20000\'name\'\'jiangsu\'}  #打印该实例的所有属性,不包括类属性

7 __str__

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Province(object):
 
    country = \'China\'
 
    def __init__(self, name):
        self.name = name
 
    def __str__(self):
        return "<obj:{0}>".format(self.name)
 
= Province("jiangsu")
print(p)  #打印这个对象
 
#输出
<obj:jiangsu>  #给对象重新起了一个名字

注:这个以后会在django框架里面会用到,这边就不多说了

8 __getitem__、__setitem__、__delitem__

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)
 
 
= Foo()
f["name"= "shuaigaogao"  #自动触发__setitem__方法
f["name"]      #自动触发__getitem__方法
del f["name"]  #自动触发__delitem__方法
 
#输出
__setitem__: name shuaigaogao
__getitem__: name
__delitem__ name

 注:这边的__delitem__没有做真正的删除,只是触发这个方法,想要真正删除,只需要在__delitem__函数中添加删除功能即可

以上是关于面向对象day08:类的特殊成员-类的起源与metaclass的主要内容,如果未能解决你的问题,请参考以下文章

day08面向对象-内部类异常

Python学习之路——Day8(面向对象进阶)

面向对象结构与成员(特殊成员)及相关内置函数

Python面向对象--类的特殊成员方法

python 面向对象整理 --------3.面向对象进阶--类的特殊成员

day6 面向对象基础