zoukankan      html  css  js  c++  java
  • 第十七篇 类的特殊成员

    1、__doc__   表示类的描述信息

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    class xx:
        """
        hello
        """
        def func(self):
            pass
    print(xx.__doc__)

    2. __module__ 和  __class__ 

      __module__ 表示当前操作的对象在那个模块

      __class__     表示当前操作的对象的类是什么

    3. __init__

      构造方法,通过类创建对象时,自动触发执行

    4. __del__

      析构方法,当对象在内存中被释放时,自动触发执行。

    注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

    5. __call__

      对象后面加括号,触发执行。

    注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    class xx:
        """
        hello
        """
        def __call__(self, *args, **kwargs):
            print("yes")
    obj = xx()
    obj()

    6. __dict__

      类或对象中的所有成员

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    class xx:
        """
        hello
        """
        def __call__(self, *args, **kwargs):
            print("yes")
    obj = xx()
    print(obj.__dict__)

     7. __str__

    其实内部做了一个监控print的事件,__str__:一旦执行print或者str(对象)的时候会主动执行类中的__str__方法,__str__返回什么值,那么对象就输出什么值

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    class xx:
        """
        hello
        """
        def __str__(self):
            return "1"
        def x(self):
            print("2")
    oo = xx()
    print(oo)

    8、__getitem__、__setitem__、__delitem__

    用于索引操作,如字典。以上分别表示获取、设置、删除数据

     1 class Foo:
     2     def __init__(self):
     3         print("init")
     4     def __getitem__(self, item):
     5         print(item)
     6     def __setitem__(self, key, value):
     7         print(key,value)
     8     def __delitem__(self, key):
     9         print(key)
    10 r["k1"]    #__getitem__
    11 r['k2'] = 12  #__setitem__
    12 del r["k3"]   #__delitem__
    13 r[1:3]     #2.7执行__getslice/3执行__getitem__
    14 r[1:3] = [11,12,13] #2.7__setslice/3__setitem__
    15 del r[1:3]          #2.7__delslice__/3__delitem__

    10. __iter__

    用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__

    class Foo:
        def __iter__(self):
            yield 1
            yield 2
    obj = Foo()
    
    #如果执行for对象的时候,自动会执行对象的iter方法,生成器
    #一个对象如果可以被for循环迭代,说明里面实现了__iter__方法,里面还有对应的值
    for i in obj:
        print(i)

    11. __new__ 和 __metaclass__

    对象是由类实例化的对象,其实类也是对象,python一切皆为对象。

    如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法

    Foo类对象 是通过type类的构造方法创建

    创建类的两种方式:

    1)  class foo(object):

          def func(self):

             print(“hello”)

    2)def func(self):

         print(“hello”)

    foo = type(“foo”,(object),{“func”;func})

    #第一个参数:类名

    #第二个参数:当前类的基类

    #第三个参数:类得成员

    类是type类实例化产生

    下图就是实例化如何产生类的

    下图执行顺序

    第一阶段

    1、首先__metaclass __ = MyType这里表示这个类是由MyType创建的,不用默认的type创建

    2、如果要创建Foo这个类,那么MyType后面要有括号,有括号就说明要执行这个MyType类中的init方法,在这个发那个发里面有继承了父类方法

    第二阶段

    3、obj = Foo()表示Foo这个类创建的对象,Foo是MyType的对象,对象加括号会执行__call__方法,之后执行new方法,

    4、执行Foo的__init__方法

    详细解释,遇到mataclass方法,会先执行foo(),也就是执行init方法

    然后执行obj=foo(),由于foo是一个对象,所以执行call方法,然后foo

    又是一个类,foo()就会执行init方法

  • 相关阅读:
    sqli-libs(3)
    python学习之路(18)
    BZOJ3534:[SDOI2014]重建——题解
    洛谷省选斗兽场全通关祭~以及之后的打算!
    BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解
    BZOJ2732:[HNOI2012]射箭——题解
    BZOJ1486:[HNOI2009]最小圈——题解
    BZOJ4552:[HEOI2016/TJOI2016]排序——题解
    BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解
    BZOJ4889 & 洛谷3759:[TJOI2017]不勤劳的图书管理员——题解
  • 原文地址:https://www.cnblogs.com/pyrene/p/6414711.html
Copyright © 2011-2022 走看看