查看内存引用的方法
globals()
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()'}
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()'}
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'>
在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在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>
因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以在函数中创建类,使用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, 是不是有些惊讶。。。