面向对象中零碎知识点

05-02 ------>metaclass

# ######################################################## 创建类 ########################################################
# 1. 创建类的两种方式
"""
class Foo(object,metaclass=type):
    CITY = "bj"

    def func(self,x):
        return x + 1

Foo = type('Foo',(object,),{'CITY':'bj','func':lambda self,x:x+1})   #这种方式跟上面Foo()类是一样的
	##这个跟上面的是一一对应关系
	#type('Foo',(object,)------>Foo(object,metaclass=type)
	#'CITY':'bj			 ------>CITY = "bj"
	#func(self,x):		 ------>'func':lambda 
	#return x + 1		 ------>self,x:x+1})
"""

# 2. 类由自定义type创建
#    类由type创建,通过metaclass可以指定当前类由那一个type创建。
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
# 3. 类的继承
#    类的基类中指定了metaclass,那么当前类也是由metaclass指定的类来创建当前类。
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)  #这是执行父类的init方法,也就是执行type的init方法
        print('创建类之后')

class Foo(object,metaclass=MyType): # 当前类,由type类创建。(因为MyType继承了type类,所以有type类创建
    CITY = "bj"
    def func(self, x):
        return x + 1

class Bar(Foo):##也就是这个类,也是有type创建,(往上一层一层找继承关系)
    pass
"""


# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

Base = MyType('Base',(object,),{})
# class Base(object,metaclass=MyType):
#     pass

class Foo(Base):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""
# ################################## 变 ##################################
"""
class MyType(type):
    def __init__(self,*args,**kwargs):
        print('创建类之前')
        super(MyType,self).__init__(*args,**kwargs)
        print('创建类之后')

def with_metaclass(arg):
    return MyType('Base',(arg,),{}) # class Base(object,metaclass=MyType): pass

class Foo(with_metaclass(object)):
    CITY = "bj"
    def func(self, x):
        return x + 1
"""

# ######################################################## 实例化 ########################################################
class MyType(type):
    def __init__(self,*args,**kwargs):
        super(MyType,self).__init__(*args,**kwargs)

class Foo(object,metaclass=MyType): # 当前类,由type类创建。
    pass


"""
0. Mytype的__init__
obj = Foo() 
1. MyType的__call__
2. Foo的__new__
3. Foo的__init__
"""
创建类,默认就会执行下面的四步骤方法,  注意,类的实例化,就是执行类的__call__方法 (obj=Foo())

———————————————————————

面向对象相关的__mro__方法

  作用:找到当前类所继承类的所有顺序(或者找的时候,优先级顺序)

class A(object):
    pass


class B(A):
    pass


class C(object):
    pass

class D(B,C):
    pass

print(D.__mro__)

执行结果如下:

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.C'>, <class 'object'>)

 

———————————————————————

__dict__方法

class Foo(object):
    CITY = 'bj'
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self):
        pass

# print(Foo.CITY)
# print(Foo.func)
print(Foo.__dict__)
print(dir(Foo))
# obj1 = Foo('oldboy',54)
# print(obj1.__dict__)

执行结果如下:

{'__module__': '__main__', 'CITY': 'bj', '__init__': <function Foo.__init__ at 0x00000000023E6A60>, 'func': <function Foo.func at 0x00000000023E6AE8>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
['CITY', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'func']

如果是类的话,查找类里面的所有东西!

如果是对象,拿到对象里面自己的数据。

 

posted @ 2018-05-02 21:18  Justin壮志凌云  阅读(82)  评论(0)    收藏  举报