Python __dict__属性详解 - //偏执 20180529
首先看一下类的__dict__属性和类对象的__dict__属性
# -*- coding: utf-8 -*-
class A(object):
"""
Class A.
"""
a = 0
b = 1
def __init__(self):
self.a = 2
self.b = 3
def test(self):
print 'a normal func.'
@staticmethod
def static_test(self):
print 'a static func.'
@classmethod
def class_test(self):
print 'a calss func.'
obj = A()
print A.__dict__
print obj.__dict__
运行结果如下:
{'a': 0, '__module__': '__main__', 'b': 1, 'class_test': <classmethod object at 0x00000000021882E8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__init__': <function __init__ at 0x00000000023A5BA8>, 'test': <function test at 0x00000000023A5C18>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': '\n Class A.\n ', 'static_test': <staticmethod object at 0x00000000021881C8>}
{'a': 2, 'b': 3}
由此可见,
虽然说一切皆对象,但对象也有不同,Python中一些内置的数据类型是没有__dict__属性的,如下:
num = 3
ll = []
dd = {}
print num.__dict__
print ll.__dict__
print dd.__dict__
运行结果如下:
Traceback (most recent call last):
File "f:\python\test.py", line 54, in <module>
print num.__dict__
AttributeError: 'int' object has no attribute '__dict__'
Traceback (most recent call last):
File "f:\python\test.py", line 55, in <module>
print ll.__dict__
AttributeError: 'list' object has no attribute '__dict__'
Traceback (most recent call last):
File "f:\python\test.py", line 56, in <module>
print dd.__dict__
AttributeError: 'dict' object has no attribute '__dict__'
int, list, dict等这些常用的数据类型是没有__dict__属性的,其实这是可预料的,就算给了它们__dict__属性也没啥用,毕竟它们只是用来做数据容器的。
子类有自己的__dict__,父类也有自己的__dict__,两者的__dict__互不影响。
# -*- coding: utf-8 -*-
class Parent(object):
a = 0
b = 1
d = 8
def __init__(self):
self.a = 2
self.b = 3
def p_test(self):
pass
class Child(Parent):
a = 4
b = 5
d = 9
def __init__(self):
super(Child, self).__init__()
self.a = 6
# self.b = 7
self.e = 7
def c_test(self):
pass
p = Parent()
c = Child()
print(Parent.__dict__)
print(Child.__dict__)
print(p.__dict__)
print(c.__dict__)
运行结果如下:
{'__module__': '__main__', 'a': 0, 'b': 1, 'd': 8, '__init__': <function Parent.__init__ at 0x000002C1C2AEF828>, 'p_test': <function Parent.p_test at 0x000002C1C2AEF438>, '__dict__': <attribute '__dict__' of 'Parent' objects>, '__weakref__': <attribute '__weakref__' of 'Parent' objects>, '__doc__': None}
{'__module__': '__main__', 'a': 4, 'b': 5, 'd': 9, '__init__': <function Child.__init__ at 0x000002C1C2AEFC18>, 'c_test': <function Child.c_test at 0x000002C1C2AEF048>, '__doc__': None}
{'a': 2, 'b': 3}
{'a': 6, 'b': 3, 'e': 7}
由此可见,
import module_a # 导入模块module_a
from module_b import * # 导入模块module_b的所有内容
__init__.py脚本文件中的__all__,用于在该模块被导入时对该模块被导入的内容进行限制。若在该模块的__init__.py中定义了__all__属性,则只有__all__内指定的类、属性、方法可以被导入;若没定义,则该模块内的所有类、公有属性,方法都可以被导入。
详参:python中模块的__all__详细使用 - 停滞的时光 - 博客园 20190320
Python中,一个py文件就是一个模块。
__all__变量,是为了限制或者指定当前模块中哪些属性(e.g. 类、函数、全局变量)能够被导入到其它模块中。
例如,
# temp_001.py
__all__=["test1_a"]
def test1_a():
print('----test1_a-----')
def test1_b():
print('----test1_b----')
# temp_003.py
from temp_001 import *
def test3():
test1_a()
# test1_b()
如果在模块temp_001.py中设置了__all__变量,则只能是__all__变量指定的那些属性可以被导入到其它模块中;如果在模块temp_001.py中没有设置__all__变量,则模块temp_001.py中的所有属性都可以被可以导入其它模块中,当然私有属性应该除外。
如果在包的__init__.py文件中设置了__all__变量,
# file_001/pkg_001/__init__.py
__all__=["temp_001", "temp_002"]
# temp_003.py
from file_001.pkg_001 import * # 导入"temp_001", "temp_002"这两个模块
def test3():
pass
如果在包的__init__.py文件中没有设置__all__变量,
# file_001/pkg_001/__init__.py
# temp_003.py
import file_001.pkg_001 # 导入file_001.pkg_001这个包
def test3():
pass
在__init__.py中可以添加一些初始化内容,因为在导入包时会首先执行下__init__.py这个文件。
Python模块导入时全局变量__all__的作用_python_chuan_day 20180326
(待阅读) 详解 Python 中的下划线命名规则 - leejun2005的个人页面 - OSCHINA 20150315
python里的“all ”作用 - 脚本小娃子 20170824
* Python中的lambda和apply用法_anshuai_aw1的博客 20180903
Python apply函数_鸿燕藏锋的博客 20190705
Operation | Big-O Efficiency |
---|---|
index [] | O(1) |
index assignment | O(1) |
append | O(1) |
pop() | O(1) |
pop(i) | O(n) |
insert(i,item) | O(n) |
del operator | O(n) |
iteration | O(n) |
contains (in) | O(n) |
get slice [x:y] | O(k) |
del slice | O(n) |
set slice | O(n+k) |
reverse | O(n) |
concatenate | O(k) |
sort | O(n log n) |
multiply | O(nk) |
*** 3.6. Lists — Problem Solving with Algorithms and Data Structures
Python自带数据结构的运行效率_勇气与行动-CSDN博客 20170603
*** Big O Notation and Algorithm Analysis with Python Examples
All You Need to Know About Big O Notation [Python Examples] 20191008
python数据结构效率问题_qq_32796425的博客-CSDN博客 20170330