• 列举面向对象中的特殊成员以及应用场景


    1. __doc__  描述类的信息

    复制代码
    class Foo(object):  
        # 单引号和双引号都可以  
        """这里描述类的信息"""  
      
        def func(self):  
            pass  
      
    print(Foo.__doc__) 
    复制代码

    显示的结果:

    2. __call__ 对象后面加括号,触发执行

    复制代码
    # __call__方法的执行是由对象加括号触发的,即:对象()或者 类()()  
    class Foo(object):  
        def __call__(self, *args, **kwargs):  
            print("running call", args, kwargs)  
      
    foo = Foo()  
    foo(1, 2, 3, name = "UserPython")   
      
    Foo()(1, 2, 3, name = "UserPython") 
    复制代码

    显示的结果:

    3. __dict__ 查看类或对象中的所有成员

    复制代码
    class Foo(object):  
        def __init__(self, name, age):  
            self.name = name  
            self.age = age  
      
    foo = Foo("UserPython", 17)  
      
    print(Foo.__dict__) #打印类里的所有属性,不包括实例属性  
    print(foo.__dict__) #打印所有实例属性,不包括类属性
    复制代码

    显示的结果:

    {'__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__init__': <function Foo.__init__ at 0x0000000000BB0730>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__', '__doc__': None}
    {'name': 'UserPython', 'age': 17}

     4. __str__ 如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值

    复制代码
    class Foo(object):  
        def __init__(self, name, age):  
            self.name = name  
            self.age = age  
      
        def __str__(self):  
            return "<obj:%s>" % self.name  
      
    foo = Foo("UserPython", 17)  
      
    print(foo) #>>><obj:UserPython>
    复制代码

    显示的效果为:

    <obj:UserPython>

     5. __getitem__ 、 __setitem__ 、__delitem__ 用于索引操作,如字典。分别表示获取、设置、删除数据

    复制代码
    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 = Foo()  
    foo["name"] = "UserPython#>>>__setitem__ name UserPython  触发__setitem__  
    foo["name"] #>>>__getitem__ name  触发__getitem__  
    del foo["name"] #>>>__delitem__ name  触发__delitem__
    复制代码

    显示的结果为:

    6. __new__ 、__metaclass__

    复制代码
    class Foo(object):  
      
        def __init__(self, name):  
            self.name = name  
      
    foo = Foo("UserPython")  
    ''''' 
    上述代码中,foo是通过Foo类实例化的对象,其实,不仅foo是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。 
    如果按照一切事物都是对象的理论:foo对象时通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的构造方法创建。 
    '''  
      
    print(type(foo)) 
    print(type(Foo)) 
    # 所以,foo对象是Foo类的一个实例,Foo类对象是type类的一个实例,即:Foo类对象是通过type类的构造方法创建。那么,创建类就可以有两种方式了
    复制代码

    显示的结果为:

    # 普通方式  
    class Foo(object):  
        def func(self):  
            print("hello UserPython")
    复制代码
    # 特殊方式  
    def func(self):  
        print("hello %s" % self.name)  
      
    def __init__(self, name, age): #构造方法  
        self.name = name   
        self.age = age  
      
    # 创建了一个type类,然后用type类实例化了一个Foo类,由于Foo本身是一个类,所以Foo又实例化了一个对象foo  
    Foo = type('Foo', (object, ), {"func" : func,  "__init__" : __init__})  
      
    foo = Foo("UserPython", 19)  
      
    foo.func()  
      
    print(type(Foo))
    复制代码

    显示的结果为:

     

    本文转载自:https://www.cnblogs.com/zhuifeng-mayi/p/9226185.html

  • 相关阅读:
    P1144 最短路计数 题解 最短路应用题
    C++高精度加减乘除模板
    HDU3746 Teacher YYF 题解 KMP算法
    POJ3080 Blue Jeans 题解 KMP算法
    POJ2185 Milking Grid 题解 KMP算法
    POJ2752 Seek the Name, Seek the Fame 题解 KMP算法
    POJ2406 Power Strings 题解 KMP算法
    HDU2087 剪花布条 题解 KMP算法
    eclipse创建maven项目(详细)
    maven的作用及优势
  • 原文地址:https://www.cnblogs.com/petrolero/p/9797859.html
Copyright © 2020-2023  润新知