在学习dict的时候,肯定听过dict是Python中最重要的数据类型,但是不一定知道为什么。马上你就会明白原因了。
Python中从模块、到函数、到类、到元类,其实主要管理方法就是靠一个一个的字典。

函数dir

先来学一个重要的内置函数。
dir返回一个列表。
列表中包含了实例的属性名,实例的类的属性名,实例的所有超类的属性名。
如果你想获取一个对象所有有效属性,你应该使用dir()来替代__dict__或者__slots__。

我们先来写一个没有什么实际意义的module。
a.py

 --------------------------------------------------------------------注:如果你对python感兴趣,我这有个学习Python基地,里面有很多学习资料,感兴趣的+Q群:895817687--------------------------------------------------------------------print('start')
import sys
from threading import Thread
import datetime
def f1():x=a     #这里故意设置了一个没有初始化的变量adef inner():y=1return yreturn innerclass A:xx=1def f2(self):yy=2return yya=A()
print('end')

模块的重要属性

在Python运行的时候,会从上到下把变量放入一个叫__dict__字典中,并运行所有的打印语句。

>>> import a
start       #打印语句会全部运行。
end
>>> a.__dict__.keys()       #会把全局变量放在这个字典中,同时Python会自动生成一些字典键值对。
dict_keys(['__name__', '__package__', '__doc__', '__loader__', 'datetime', 'A', '__spec__', '__builtins__', '__cached__', '__file__', 'f1', 'sys', 'a', 'Thread'])

你肯定听说过import和from语句是隐形的赋值语句,现在可以看到他们的名字出现在这个字典中了吧。
你也肯定听说过def和class语句是隐形的赋值语句,找找看是不是也出现在这个字典中了?
当然还包括我们的赋值语句中定义的变量a了。

现在我们进一步探究一下这个有用的字典。

>>> a.__builtins__.keys()   #这个是builtins模块中定义的所有变量,中间省略了很多。
#Python判断我们的一个变量是否定义过,就是看变量是否出现在a.__dict__或a.__builtins__中。
dict_keys(['setattr', 'slice', 'ZeroDivisionError', 'IndexError', 'KeyError', 'TimeoutError', 'map', 'isinstance', 'bin', 'bytearray', 'zip', 'locals', 'IsADirectoryError', 'AttributeError', ...'False', 'print', 'vars', 'exit', 'EnvironmentError'])
>>> a.__doc__       #这个是模块的文档字符串,由于我们没有定义,所以为Null
>>> a.__file__      #这个是运行的文件名。
'/home/aaa/proj/a.py'
>>> a.__name__      #这个是我们的文件名,不包括路径和扩展名py
'a'

额外说一句,如果我们直接运行一个Python文件,那么这个文件会出现在sys.modules中,事实上,我们所有import的对象都会出现在这个字典中。

>>> sys.modules[__name__]
<module '__main__' (built-in)>      #这个就是我们运行的Python文件。
>>> sys.modules['datetime']
<module 'datetime' from '/usr/lib/python3.4/datetime.py'>   #这是我们导入的datetime文件。
>>> sys.modules['logging']      #我们没有import过logging模块,所以找不到。
Traceback (most recent call last):File "<stdin>", line 1, in <module>
KeyError: 'logging'

函数的重要属性

我们在a.py中输入一下测试内容。

g=55
def f1(arg=2,arg2='c',*,kargs=3,kargs2='dd'):x=a     #这里故意设置了一个没有初始化的变量adef inner():y=1return yreturn inner
f1.val=3
f1.val2='python'

我们运行下面的测试内容来进行探索。

>>> from a import f1
>>> f1.__class__        #由于Python内部采用function类来创建函数,所以函数是function类的实例,通过__class__可以看到一个实例的类。
<class 'function'>
>>> f1.__module__       #找到函数属于那个模块
'a'
>>> f1.__name__         #函数的名词
'f1'
>>>f1.__code__          #这是f1的代码对象,请移步"解释型和编译型语言的区别以及Python的运作方式"去查看。
>>> f1.__globals__.keys()   #该函数能够使用的所有全局变量,所以Python通过如果判断函数中的变量没有在本地定义,且不在f1.__dict__中,且不在f1.__globals__字典中,且不在f1.__modules__.__builtins__中的话,那么会报参数为定义的错误。
dict_keys(['f1', '__name__', '__doc__', '__builtins__', '__file__', '__spec__', '__cached__', '__package__', 'g', '__loader__'])
>> f1.__dict__         #如果定义了函数的属性,那么出现在__dict__中。
{'val2': 'python', 'val': 3}
>>> f1.__defaults__    #如果定义了位置默认参数,那么出现在这个字典中,也就是说函数的默认参数是在函数定义的时候评估的
(2, 'c')
#如果默认参数获取失败,那么函数定义就会失败。
>>> def f(x=c):...      #默认参数评估出错,定义阶段就会报错。
...
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'c' is not defined
>>> def ff(x):           #如果是函数内部变量评估出错,那么函数定义阶段捕获报错,但是运行阶段会报错。
...   x=c
...
>>> ff(1)
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "<stdin>", line 2, in f
NameError: name 'c' is not defined
>>> f1.__kwdefaults__       #关键字参数的默认参数放在__kedefaults__中。
{'kargs': 3, 'kargs2': 'dd'}

我知道如果我们定义类,那么Python默认采用元类type来初始化该类,而且我会在元类部分详细介绍其运作方式。
我知道我们的函数是通过class function来初始化的,但是具体的运作方式有所不知,如果你知道哪里有介绍内容,麻烦通过评论或者邮箱jessonsh@163.com发给链接给我。

类和实例的重要属性

这个很重要,我们先稍微了解一下,在下面几篇文章中,我会着重介绍。
先定义一个简单的类:
a.py

g=55
class Desc:def __get__(self,ins, cls):print(self)
class A:arg=2arg2=Desc()def __init__(self, name, age):self.name = nameself.age=agedef f2(self,x=1):y='a'print(x)

下面开始我们的测试:

>>> from a import A
>>> dir(A)      #所有A可以用的属性名列表
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'arg', 'arg2', 'f2']
>>> A.__doc__       #A的文档字符串
>>> A.f2            #A中定义的方法f2,每个定义的方法名都会出现在A.__dict__中。
<function A.f2 at 0x7f970a8d2bf8>
>>> A.__module__    #A所在的模块名。
'a'
>>> A.arg       #A中的所有属性都会出现在A.__dict__中。
2
>>> A.arg2      #这是A的arg2属性,是一个描述符对象。
<a.Desc object at 0x7f11f25e7588>
>>> A.__dict__      #类A的__dict__属性,这是一个相当重要的属性。
mappingproxy({'arg': 2, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None, 'arg2': <a.Desc object at 0x7f9708995550>, '__module__': 'a', '__dict__': <attribute '__dict__' of 'A' objects>, 'f2': <function A.f2 at 0x7f970a8d2bf8>})
>>> ins=A('js',22)
>>> ins.__dict__        #这是A的实例ins的__dict__对象,在很多时候,该属性需要看类A的__dict__的脸色。
{'age': 22, 'name': 'js'}

总结

  1. 模块、类、函数均有以下属性:
    dict:该对象的属性字典。
    doc:返回说明性的文字,定义在块语句的最前面
    name:返回该对象的名字
  2. 类、函数均有以下属性:
    __module,用来返回该对象的模块名。
    class:用来返回类的类型(或者实例的类)、或者函数的类型
    globals:用来返回该对象所有可用的全局变量名。
  3. 模块有__file__属性,用来返回模块包含路径的文件名,有__builtins__属性,用来返回所有的可以使用的内置函数、内置异常对象、内置保留字等对象。 无论在任何位置,Python均会按照LEGB法则,在最后搜索模块的__builtins__属性,来最后判断该变量是否已经定义。
  4. 模块、类、寒酸通过调用dir函数,可以得到该对象实际可以使用的所有属性。

Python属性、方法和类管理系列之----属性初探相关推荐

  1. Python中类方法、类实例方法、静态方法,私有属性和私有方法有何区别?

    类方法 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,类对象和实例对象都可调用. 使用格式: 对类的属性进行操作,就要用类的方法. @class ...

  2. python装饰器类-Python 装饰器、类装饰器、属性装饰器

    今天来介绍一下python的装饰器. 1.首先来介绍一下简单的装饰器, def play(): return "i can play" if __name__ == '__main ...

  3. java 属性 方法_Java类的属性与方法

    <Java类的属性与方法>由会员分享,可在线阅读,更多相关<Java类的属性与方法(24页珍藏版)>请在人人文库网上搜索. 1.教师: 班级:,第11讲 类的方法,回顾,1.成 ...

  4. python定义方法继承类_Python类的定义、继承及类对象使用方法简明教程

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的 ...

  5. python中类方法与实例方法的区别-python中类方法、类实例方法、静态方法的使用与区别...

    1.如果你需要用实例来调用你的方法,那么在定义方法的时候,一定要把第一个参数设置成为self: ?2.如果你需要使用静态方法,那么你需要在方法前面加上@staticmethod修饰符: ?3.如果要使 ...

  6. 大神开车的标题-python中类方法、类实例方法、静态方法的使用与区别

    https://www.cnblogs.com/wcwnina/p/8644892.html

  7. es6 类的私有属性_JavaScript ES6类中的私有属性

    要扩展@loganfsmyth的回答: JavaScript中唯一真正私有的数据仍然是作用域变量.不能以与公共属性相同的方式在内部访问私有属性,但是可以使用范围变量来存储私有数据. 作用域变量 这里的 ...

  8. 类的实例方法静态方法类方法属性方法属性

    目录: 分类 实例方法 静态方法 类方法 属性方法 属性 分类: 按照调用方式可以分为3种,实例方法.静态方法.和类方法 实例方法 实例方法只能通过实例对象调用,不能通过类进行调用.实例方法再定义时候 ...

  9. python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

    1.#类方法@classmethod,只能访问类变量,不能访问实例变量,通过cls参数传递当前类对象,不需要实例化,直接[类名.方法名()],可通过类对象和类对象实例访问 类方法:第一个参数强制为类对 ...

最新文章

  1. RDKit:化合物相似性搜索(基于Python3)
  2. Python基础之简单用户交互
  3. 江湖救急,换对姿势比《颈椎病康复指南》更有效丨极客官舍
  4. 关键字之defer、panic、recover
  5. android 屏幕保持唤醒 不锁屏 android.permission.WAKE_LOCK
  6. 大牛书单 | 腾讯技术大咖推荐你五一看这些书
  7. Linux网络编程 之 网络协议概述(一)
  8. Yii2性能优化之:缓存依赖
  9. Android开发笔记(二十九)使用SharedPreferences存取数据
  10. LeetCode Rearrange String k Distance Apart
  11. 很不错的js幻灯片代码分享
  12. 京东时间校准_微星PAG272QR评测(友达新代号屏出现,QR2正在测试,稍晚一点时间发出)...
  13. 「 硬核分享」 ❤️ QQ连连看自动消除外挂完整源码❤️「 复制即用」
  14. linux硬盘异响,完美解决Ubuntu Linux关机异响[SATA硬盘]
  15. C语言实现数字全排列
  16. win7计算机名怎么是感叹号,Win7连接wifi信号后出现感叹号三种原因和解决方法
  17. 【SpringBoot教程】SpringBoot开发HTTP接口GET请求实战
  18. 无公网IP远程黑群晖【内网穿透】
  19. staticmethod静态方法有什么作用(含例子运用)
  20. php学生评价系统,学生综合素质评价系统

热门文章

  1. 以太坊怎么注册_以太坊2.0将至,牛市即将到来??
  2. service层的方法上使用@Transactional注解,程序发生异常没有回滚
  3. 百度贴吧——因百度账号策略调整导致长时间未登录的账号(最后登录在2017年6月1日以前)网页端无法登陆、移动端异常解决方案
  4. HTML/CSS——子元素相对于父元素固定定位解决方案
  5. Windows Security——获取Windows已经保存的WiFi网络密码
  6. Recover it!
  7. Serval and Bus
  8. mysql可以存储标点么_MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》...
  9. 安卓CheckBox实现单选
  10. ajax返回html乱码问题,ajax返回的html代码问题