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里面在封装底层的时候,让用户以为调用的是字典,其实调用的是实例对象。

 

posted @ 2017-07-31 23:10  Mr.hu  阅读(108)  评论(0)    收藏  举报