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

    显示的结果为:

     

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/liurenli/p/10128020.html
Copyright © 2011-2022 走看看