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__ 

说明: 

作用:当多次引用的时候,查看是从哪里导入的。没啥卵用

  1. __module__: 表示当前操作的对象在哪个模块
  2. __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__函数中添加删除功能即可

  

 

posted @ 2018-02-02 14:31  东郭仔  阅读(102)  评论(0)    收藏  举报