Skip to content

Latest commit

 

History

History
291 lines (246 loc) · 8.9 KB

61.元类.md

File metadata and controls

291 lines (246 loc) · 8.9 KB

python内存和一切皆对象

一.python内存

查看内存引用的方法

globals()

1.变量

In [1]: a = 111                                                                                                                                                                                                                               
In [2]: globals()                                                                                                                                                                                                                       
Out[2]: 
{'__name__': '__main__',
 '__doc__': 'Automatically created module for IPython interactive environment',
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 '__builtin__': <module 'builtins' (built-in)>,
 '__builtins__': <module 'builtins' (built-in)>,  # 内建函数
 '_ih': ['', 'a = 111', 'globals()'],
 '_oh': {},
 '_dh': ['/Users/toby/Downloads/PythonAdvanced'],
 'In': ['', 'a = 111', 'globals()'],
 'Out': {},
 'get_ipython': <bound method InteractiveShell.get_ipython of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x7fb034cda340>>,
 'exit': <IPython.core.autocall.ExitAutocall at 0x7fb034ca5e20>,
 'quit': <IPython.core.autocall.ExitAutocall at 0x7fb034ca5e20>,
 '_': '',
 '__': '',
 '___': '',
 '_i': 'a = 111',
 '_ii': '',
 '_iii': '',
 '_i1': 'a = 111',
 'a': 111,  # 这个就是内存中的对应关系
 '_i2': 'globals()'}

2.函数

In [4]: def test(): 
   ...:     pass 
   ...:                                                                                                                                                                                                                                                

In [5]: globals()                                                                                                                                                                                                                                      
Out[5]: 
{'__name__': '__main__',
 '__doc__': 'Automatically created module for IPython interactive environment',
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 '__builtin__': <module 'builtins' (built-in)>,
 '__builtins__': <module 'builtins' (built-in)>,
 '_ih': ['',
  'a = 111',
  'globals()',
  'global()',
  'def test():\n    pass\n    ',
  'globals()'],
 '_oh': {2: {...}},
 '_dh': ['/Users/toby/Downloads/PythonAdvanced'],
 'In': ['',
  'a = 111',
  'globals()',
  'global()',
  'def test():\n    pass\n    ',
  'globals()'],
 'Out': {2: {...}},
 'get_ipython': <bound method InteractiveShell.get_ipython of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x7fb034cda340>>,
 'exit': <IPython.core.autocall.ExitAutocall at 0x7fb034ca5e20>,
 'quit': <IPython.core.autocall.ExitAutocall at 0x7fb034ca5e20>,
 '_': {...},
 '__': '',
 '___': '',
 '_i': 'def test():\n    pass\n    ',
 '_ii': 'global()',
 '_iii': 'globals()',
 '_i1': 'a = 111',
 'a': 111,
 '_i2': 'globals()',
 '_2': {...},
 '_i3': 'global()',
 '_i4': 'def test():\n    pass\n    ',
 'test': <function __main__.test()>,  # 这个就是内存中的对应关系
 '_i5': 'globals()'}

3.类

In [6]: class aaa(object):pass                                                                                                                                                                                                                         

In [7]: globals()                                                                                                                                                                                                                                      
Out[7]: 
{'__name__': '__main__',
 '__doc__': 'Automatically created module for IPython interactive environment',
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 '__builtin__': <module 'builtins' (built-in)>,
 '__builtins__': <module 'builtins' (built-in)>,
 '_ih': ['',
  'a = 111',
  'globals()',
  'global()',
  'def test():\n    pass\n    ',
  'globals()',
  'class aaa(object):pass',
  'globals()'],
 '_oh': {2: {...}, 5: {...}},
 '_dh': ['/Users/toby/Downloads/PythonAdvanced'],
 'In': ['',
  'a = 111',
  'globals()',
  'global()',
  'def test():\n    pass\n    ',
  'globals()',
  'class aaa(object):pass',
  'globals()'],
 'Out': {2: {...}, 5: {...}},
 'get_ipython': <bound method InteractiveShell.get_ipython of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x7fb034cda340>>,
 'exit': <IPython.core.autocall.ExitAutocall at 0x7fb034ca5e20>,
 'quit': <IPython.core.autocall.ExitAutocall at 0x7fb034ca5e20>,
 '_': {...},
 '__': {...},
 '___': '',
 '_i': 'class aaa(object):pass',
 '_ii': 'globals()',
 '_iii': 'def test():\n    pass\n    ',
 '_i1': 'a = 111',
 'a': 111,
 '_i2': 'globals()',
 '_2': {...},
 '_i3': 'global()',
 '_i4': 'def test():\n    pass\n    ',
 'test': <function __main__.test()>,
 '_i5': 'globals()',
 '_5': {...},
 '_i6': 'class aaa(object):pass',
 'aaa': __main__.aaa,  # 这个就是内存中的对应关系
 '_i7': 'globals()'}

注意:

通过globals()函数可以查看和修改Python运行中的全局变量

其中Out中__builtins__是内建函数,可以查看Python内建函数、异常和其他内建对象的命名空间。

二.一切皆对象

demo01:

# -*- coding:utf-8 -*-
class CC(object):
    num = 100

    def test(self):
        print("test is show")


cc = CC()
cc.test()

xx = CC
bb = xx()
bb.test()


print(cc.__class__)  # 查看创建者
print(cc.__class__.__class__)
print(cc.__class__.__class__.__class__)
print(int.__class__)

运行结果:

test is show
test is show
<class '__main__.CC'>
<class 'type'>
<class 'type'>
<class 'type'>

1.类也是对象

在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立:

>>> class ObjectCreator(object):
…       pass>>> my_object = ObjectCreator()
>>> print(my_object)
<__main__.ObjectCreator object at 0x8974f2c>

但是,Python中的类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只要你使用关键字class,Python解释器在执行的时候就会创建一个对象。

下面的代码段:

>>> class ObjectCreator(object):
…       pass

将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类对象ObjectCreator)拥有创建对象(实例对象)的能力。但是,它的本质仍然是一个对象,于是乎你可以对它做如下的操作:

你可以将它赋值给一个变量

你可以拷贝它

你可以为它增加属性

你可以将它作为函数参数进行传递

下面是示例:

>>> print(ObjectCreator)  # 你可以打印一个类,因为它其实也是一个对象
<class '__main__.ObjectCreator'>
>>> def echo(o):
…       print(o)
…
>>> echo(ObjectCreator)  # 你可以将类做为参数传给函数
<class '__main__.ObjectCreator'>
>>> print(hasattr(ObjectCreator, 'new_attribute'))
Fasle
>>> ObjectCreator.new_attribute = 'foo'  # 你可以为类增加属性
>>> print(hasattr(ObjectCreator, 'new_attribute'))
True
>>> print(ObjectCreator.new_attribute)
foo
>>> ObjectCreatorMirror = ObjectCreator  # 你可以将类赋值给一个变量
>>> print(ObjectCreatorMirror())
<__main__.ObjectCreator object at 0x8997b4c>

2.动态地创建类

因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用class关键字即可。

>>> def choose_class(name):
…       if name == 'foo':
…           class Foo(object):
…               pass
…           return Foo     # 返回的是类,不是类的实例
…       else:
…           class Bar(object):
…               pass
…           return Bar
…
>>> MyClass = choose_class('foo')
>>> print(MyClass)  # 函数返回的是类,不是类的实例
<class '__main__'.Foo>
>>> print(MyClass())  # 你可以通过这个类创建类实例,也就是对象
<__main__.Foo object at 0x89c6d4c>

但这还不够动态,因为你仍然需要自己编写整个类的代码。由于类也是对象,所以它们必须是通过什么东西来生成的才对。

当你使用class关键字时,Python解释器自动创建这个对象。但就和Python中的大多数事情一样,Python仍然提供给你手动处理的方法。

还记得内建函数type吗?这个古老但强大的函数能够让你知道一个对象的类型是什么,就像这样:

>>> print(type(1))  # 数值的类型
<type 'int'>
>>> print(type("1"))  # 字符串的类型
<type 'str'>
>>> print(type(ObjectCreator()))  # 实例对象的类型
<class '__main__.ObjectCreator'>
>>> print(type(ObjectCreator))  # 类的类型
<type 'type'>

仔细观察上面的运行结果,发现使用type对ObjectCreator查看类型是,答案为type, 是不是有些惊讶。。。