day7-类的特殊成员方法
概述
前面除了介绍了静态方法,类方法和属性方法外,还有另外一些类的方法,叫做类的特殊成员方法
类的特殊成员方法
1.__doc__
用法:表示类的描述信息
class dog(object):
"""这个类是描述狗这个对象的""" #类的描述信息
def __init__(self, name):
self.name = name
self.__food = None
print(dog.__doc__) #打印类的描述信息
#输出
这个类是描述狗这个对象的
2.__module__和__class__
用法:
__module__ 表示当前操作的对象在哪个模块
__class__ 表示当前操作的对象的类是什么

module_3子文件夹lib下的aa.py代码:
class C:
def __init__(self):
self.name = "Dick"
module_3文件夹下index.py的代码
from lib.aa import C
obj = C()
print("obj.__module__:",obj.__module__) #输出 lib.aa,即:输出模块
print("obj.__class__:",obj.__class__) #输出 lib.aa.C,即输出类
#输出
obj.__module__: lib.aa #表明obj对象是从哪个模块下导入过来的
obj.__class__: <class 'lib.aa.C'> #表明这个类的本身(包含类名导入的路径)
3.__init__
用法:构造方法,通过类创建对象时,自动触发执行
class Dog(object):
def __init__(self,name): #创建对象时,自动触发执行
self.name = name
d = Dog("Dick")
print(d.name)
#输出
Dick
4.__del__
用法:析构方法,当对象在内存中被释放时,自动触发执行
class Role(object):
nationality = 'Janpan'
def __init__(self, name):
self.name = name
def buy_gun(self, gun_name):
print("just bought %s" % gun_name)
def __del__(self): # 定义析构函数,它在对象消逝的时候被调用
print("del.....run....")
d1 = Role("Dick")
#输出
del.....run....
注:此方法一般无需定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
5.__call__
用法:对象后面加括号,触发执行
class dog(object):
def __init__(self, name):
self.name = name
self.__food = None
def talk(self):
print("%s is talking"%self.name)
def __call__(self, *args, **kwargs): #实现obj加括号继续可以调用
print("running call",args,kwargs)
d = dog("Dick")
d(1,2,3,name="Michael") # 或dog("Dick")(1,2,3,name="Michael") 是一样的
#输出
running call (1, 2, 3) {'name': 'Michael'}
注:构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行时由对象后加括号触发的,即:对象()或者类()()
6.__dict__
用法:查看类或对象中的所有成员
class dog(object):
def __init__(self, name,food):
self.name = name
self.food = food
def talk(self):
print("%s is talking"%self.name)
def __call__(self, *args, **kwargs):
print("running call",args,kwargs)
#获取类的成员,即:静态字段,方法
print(dog.__dict__)
#输出:打印类里所有属性,不包括实例属性
{'__weakref__': <attribute '__weakref__' of 'dog' objects>, '__module__': '__main__', '__doc__': None, '__init__': <function dog.__init__ at 0x0000000000CFE840>, 'talk': <function dog.talk at 0x0000000000CFE8C8>, '_
#获取对象obj1的成员
obj1 = dog("Jacky","baozi")
print(obj1.__dict__)
#输出:打印所有实例属性,不包括类属性
{'food': 'baozi', 'name': 'Jacky'}
#获取对象obj2的成员
obj2 = dog("Maria","mantou")
print(obj2.__dict__)
#输出:打印所有实例属性,不包括类属性
{'food': 'mantou', 'name': 'Maria'}
7.__str__
用法:如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值
class dog(object):
def __init__(self, name,food):
self.name = name
self.food = food
def talk(self):
print("%s is talking"%self.name)
def __call__(self, *args, **kwargs):
print("running call",args,kwargs)
d = dog("Jacky","baozi")
print(d)
#输出
<__main__.dog object at 0x0000000000D56128> #打印出对象d内存地址
如果输出对象内存地址,它的地址特别长,而且在类实例化多个对象时,我们分不清到底哪个内存地址对应哪个对象,我们可以在类中加入此方法,还有后面学习Django的modules里会用到
def __str__(self):
return "<obj:%s>" %self.name
#输出
<obj:Jacky>
8.__getitem__ 、__setitem__、__delitem__
用法:用于索引操作,如字典:分别表示获取、设置、删除数据
class Foo(object):
def __init__(self): #1方法
self.data={}
def __getitem__(self, key):
print("__getitem__",key)
return self.data.get(key) #3
def __setitem__(self, key, value):
print("__setitem__",key,value)
self.data[key] = value #2
def __delitem__(self, key):
print("__delitem__",key)
#对对象进行赋值
obj = Foo()
obj["name"] = "Dick"
print(obj["name"])
print(obj.data)
#输出
__setitem__ name Dick
#(一)加入方法1,和设置2
obj["name"] = "Dick" #自动触发执行__setitem__方法
print(obj.data)
#输出
{'name': 'Dick'}
#(二)在方法中设置3
obj["name"] #自动触发执行__getitem__方法
print(obj["name"])
#输出
Dick
#(三)在方法中设置
del obj["name"] #自动触发执行__delitem__方法
#输出
__delitem__ name
注意:这里自动触发了__delitem__方法,但是它没有真正的删除,只是触发了这个方法,如果想真正删除,只需要在__delitem__方法中添加删除的代码即可。
应用场景:因为输出的是字典的表现形式,所以自己可以写一个类,封装自己的字典,对类进行实例化后,让用户以字典的形式调用。在一些高级场景中,比如说在Django里面在封装底层的时候,让用户以为调用的是字典,其实调用的是实例对象。

浙公网安备 33010602011771号