• 面向对象【day08】:类的特殊成员(一)


    本节内容

    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__函数中添加删除功能即可

  • 相关阅读:
    Redis宣言
    软件工程
    分布式编程
    编程泛型
    tcp/ip高效编程总结
    IP协议详解
    gevent程序员指南
    网站架构
    这些话,是乔布斯给世间留下的真正伟大礼物
    Flink/Spark 如何实现动态更新作业配置
  • 原文地址:https://www.cnblogs.com/luoahong/p/7208395.html
Copyright © 2020-2023  润新知