zoukankan      html  css  js  c++  java
  • 面向对象中的特殊成员及应用场景

    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))
    复制代码

    显示的结果为:

     

  • 相关阅读:
    2018ACM上海大都会赛 F Color it【基础的扫描线】
    2018大都会赛 A Fruit Ninja【随机数】
    两个数互质的概率
    【shell脚本学习-3】
    【mysql学习-1】
    【HCNE题型自我考究】
    【为系统营造的一个安全的环境】
    【nginx下对服务器脚本php的支持】
    【linux基于Postfix和Dovecot邮件系统的搭建】
    不同状态的动态路由协议对比
  • 原文地址:https://www.cnblogs.com/liurenli/p/10128020.html
Copyright © 2011-2022 走看看