Python中__xxx__属性

文章目录

  • __xxx__属性
    • __dict__属性 (转载,订正)
      • 1.无处不在的__dict__属性
      • 2.Python里什么没有__dict__属性
      • 3.发生继承时候的__dict__属性
      • __dict__属性小结
    • __all__属性
    • __call__属性
    • __attr__属性
  • ()方法
    • .get()
    • .apply()
  • Big-O Efficiency of Python List Operators
      • 待补充
    • 待补充
      • 待补充

__xxx__属性

__dict__属性 (转载,订正)

Python __dict__属性详解 - //偏执 20180529

1.无处不在的__dict__属性

  首先看一下的__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}

  由此可见,

  1. 类变量、实例方法(普通函数)、静态方法、类方法、以及一些内置的属性都是放在的__dict__里的;
  2. 类对象的__dict__中存储的是 字段 (fields),即self.xxx。

2.Python里什么没有__dict__属性

  虽然说一切皆对象,但对象也有不同,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__属性也没啥用,毕竟它们只是用来做数据容器的。

3.发生继承时候的__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}

  由此可见,

  1. 无论是父类还是子类,每个类的类变量、函数名都放在自己的__dict__中;的__dict__属性是不包含 字段 (fields) 的
  2. 类对象的__dict__中存储的是 字段 (fields),即self.xxx

__dict__属性小结

  1. 内置的数据类型没有__dict__属性;
  2. 每个类有自己的__dict__属性,就算存着继承关系,父类的__dict__ 并不会影响子类的__dict__;的__dict__属性是不包含 字段 (fields) 的
  3. 类对象也有自己的__dict__属性, 存储self.xxx 信息,父子类对象公用__dict__;类对象的__dict__中存储的是 字段 (fields),即self.xxx

__all__属性

import module_a  # 导入模块module_a
from module_b import *  # 导入模块module_b的所有内容

  __init__.py脚本文件中的__all__,用于在该模块被导入时对该模块被导入的内容进行限制。若在该模块的__init__.py中定义了__all__属性,则只有__all__内指定的类、属性、方法可以被导入;若没定义,则该模块内的所有类、公有属性,方法都可以被导入。
  详参:python中模块的__all__详细使用 - 停滞的时光 - 博客园 20190320

__call__属性

  Python中,一个py文件就是一个模块。
  __all__变量,是为了限制或者指定当前模块中哪些属性(e.g. 类、函数、全局变量)能够被导入到其它模块中。

  1. 普通模块中添加__all__变量

  例如,

# 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中的所有属性都可以被可以导入其它模块中,当然私有属性应该除外。

  1. 包的__init__.py文件中添加__all__变量

  如果在包的__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

__attr__属性

()方法

.get()

  • Python 中的字典的get()方法(关键词:dict.get(key, default=None))_Henry1991back的博客 20181114

.apply()

* Python中的lambda和apply用法_anshuai_aw1的博客 20180903
Python apply函数_鸿燕藏锋的博客 20190705

Big-O Efficiency of Python List Operators

Table 2: Big-O Efficiency of Python List Operators
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

待补充

  

待补充

待补充

  

你可能感兴趣的:(Python相关,python)