python 入坑路 类的特殊成员方法
一、概述
前面我们讲了类的方法,有普通方法,就是我们自己定义的方法,还有静态方法,类方法,属性方法,
其实还有另一类方法,叫做类的特殊成员方法
二、类的特殊成员方法
2.1 __doc__ ,表示类的描述信息
class Dog(object):
'''
dog class #__doc__ 就是打印这里的信息
'''
def __init__(self,name):
self.name=name
self.age=None
self.__sex=None
def walk(self):
print("%s is walking..." %self.name)
d=Dog("niubi")
print(d.__doc__)
-----输出----
dog class
2.2 __module__和__class__
说明:
作用:当多次引用的时候,查看是从哪里导入的。没啥卵用
- __module__: 表示当前操作的对象在哪个模块
- __class__:表示当前操作的对象的类是什么
2.3 __init__
说明:构造方法,通过类创建对象时,自动触发执行
2.4 __del__
说明:析构方法,当对象在内存中被释放时,自动触发执行
|
1
2
|
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的 |
2.5__call__
class Foo(object):
def __init__(self):
self.name = "nb"
def __call__(self, *args, **kwargs): # 重写call方法
print("running call", args, kwargs)
f = Foo() # 执行__init__
f(1, 2, 3, name="nb") # 执行call方法,也可以写成 Foo()(1,2,3,name="nb")
---
running call (1, 2, 3) {'name': 'nb'}
2.6__dict__ ,挺有用
类.__dict__ 查看类中所有方法成员
class Dog(object):
'''
dog class
'''
def __init__(self,name):
self.name=name
self.age=None
self.__sex=None
def walk(self):
print("%s is walking..." %self.name)
def eat(self,food):
print("%s is eating %s" %(self.name,food))
def age(self,age):
self.age=age
def sex(self):
return self.__sex
d=Dog("NIUBI")
print(Dog.__dict__)
=======
{'__module__': '__main__', '__doc__': '\n dog class\n ', '__init__': <function Dog.__init__ at 0x0000000002901EA0>, 'walk': <function Dog.walk at 0x0000000002901F28>, 'eat': <function Dog.eat at 0x0000000002908048>, 'age': <function Dog.age at 0x00000000029080D0>, 'sex': <function Dog.sex at 0x0000000002908158>, '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>}
实例.__dict__ :打印出类中所有属性,不包括类属性。
class Dog(object):
'''
dog class
'''
class_shuxing="hehe" #这个类属性没有被打印出来
def __init__(self,name):
self.name=name
self.age=None
self.__sex=None
def walk(self):
print("%s is walking..." %self.name)
def eat(self,food):
print("%s is eating %s" %(self.name,food))
def age(self,age):
self.age=age
def sex(self):
return self.__sex
d=Dog("NIUBI")
#print(Dog.__dict__)
print(d.__dict__)
==============
{'name': 'NIUBI', 'age': None, '_Dog__sex': None}
#不包括类属性
2.7 __str__ ,
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值 ,据说 Djiango 中很长用,以后详解
class test(object):
def __init__(self,name):
self.name=name
def __str__(self):
return "<obj:{} + NB >".format(self.name)
d=test("hehe")
print(d)
--------------
<obj:hehe + NB >
2.8 __getitem__、__setitem__、__delitem__
说明:用于索引操作,如字典。以上分别表示获取、设置、删除数据
作用:据说可以用类封装一些东西,然后暴露给用户一个字典,在类中控制用户对字典操作的权限。
class test(object):
def __getitem__(self, item):
print("getitem",item)
def __setitem__(self, key, value):
print("setitem",key,value)
def __delitem__(self, key):
print("delete",key)
t=test()
t["name"]
t["name"]="nb"
del t["name"]
-----------------
getitem name
setitem name nb
delete name #注:这边的__delitem__没有做真正的删除,只是触发这个方法,想要真正删除,只需要在__delitem__函数中添加删除功能即可

浙公网安备 33010602011771号