• python类和对象-扩展


    1、为类或对象动态创建属性或方法

    2、__slots__ = ('name','age'),【实例】只能创建指定的属性属性或方法 ---新式类

    3、执行父类的构造函数的不同
    Father.__init__(self) --经典类
    super(Son,self).__init__() --新式类

    4、Person.__bases__ 只会显示一层继承的所有父类
    5、__call__
      __call__ 一个已经实例化的对象p,在调用p()
    6、python中一切都是对象,类本身也是对象,类是由type产生的。

    class Foo
      pass
    Bar = type('Bar',(object,),{'name':123,'Func':Hello})

    以上等同于

    class Bar:
        name = 'yangmv'
        def func(self):
            print 'go func'
    obj = Bar().func()


    既然这样,那么对于定义的类来说,只要定义了一个类,就调用一次 type类的构造函数,如何验证?

    7、__metaclass__  可以指定类是由那个type来产生的

    class MetaClass(type):
        def __init__(self,name,bases,dicts):
            print name
         
    class C1:
        __metaclass__ = MetaClass
         
    class C2:
        __metaclass__ = MetaClass

    8、__init__ __new__ __call__
    我们知道执行 f = Foo() 会默认执行构造函数 __init__
    实际上执行了:type('Foo',bases,dicts).__call__('Foo')

    class MetaClass(type):
         
        def __init__(self,name,bases,dicts):
            print name
        def __call__(self, *args, **kwargs):
            print self
            result = self.__new__(self, *args, **kwargs)
            print result
            type(result).__init__(result,*args,**kwargs)
            return result
             
    class C1:
        __metaclass__ = MetaClass
             
        def __init__(self):
            print 'c1.__init__'
            self.name = 'yangmv'
             
        def __new__(cls, *args, **kwargs):
            print cls
            print args
            print kwargs
            return object.__new__(cls, *args, **kwargs)
             
        def Hello(self):
            print 'hello'
    class C2:
        __metaclass__ = MetaClass
         
    #c = C1()
    c1 = object.__new__(C1)
    c1.Hello()

  • 相关阅读:
    HDU Intelligence System(tarjan+缩点)
    CF Easy Tape Programming(题意)
    poj 3694 Network(边双连通+LAC)
    20121116 CF DIV.2
    poj 2942 Knights of the Round Table(点双连通)
    解决Navihelper.dll(女生宿舍)病毒的方法一则
    在C++ Builder中调用FORTRAN生成的DLL
    过去的2004
    怎么取得DLL文件中的函数名列表?
    Gmail invitations
  • 原文地址:https://www.cnblogs.com/yangmv/p/6217261.html
Copyright © 2020-2023  润新知