前言
Python提供了很多内置函数,dir()函数只是其中的一个,它可以查看某个对象具有哪些属性,在Python中的一切都是对象,即每个module、每个class、每个method、每个function都是对应类型产生的object,今天我们使用内置函数dir()查看这些对象都有哪些属性,而在这些属性中,__开头与__结尾的属性,又被称作特殊属性!如果你对面向对象不熟悉,起码先开个头吧,毕竟Python是面向对象语言,只不过它支持面向过程……
Python有哪些级别的对象?
1、package(同module)
2、module
3、class
4、instance
5、function
6、method
接下来窥探一下Python中的这些对象各自都有哪些属性呢
包(package)对象的属性有哪些?
提示:还记得什么是包吗?
答案:某个目录下如果有个__init__.py文件,则称该目录为包
1、我们首先新建一个package,名字叫temp_package,在它的__init__.py文件中,我什么都没有定义,只写了一行注释
# 空的__init__.py
2、再包下新建新建一个main.py,main.py中的只写了两行代码
import temp_package
print(dir(temp_package))
3、执行main.py,并查看输出结果
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
可以看到此package对象的属性,都是一些特殊属性,特殊属性也称内置属性,是以__开头,并以__结尾的属性
__name__
__file__
__builtins__
等等……
4、接下来我们在temp_package的__init__.py文件中添加一个全局变量
MY_FIRST = "hello"
5、再次执行main.py模块,查看temp_package对象有哪些属性
import tempPackage
print(dir(tempPackage))
6、查看输出结果
['MY_FIRST', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
发现temp_package包多了一个我们自定义的属性:MY_FIRST
7、总结
package的属性,是__init__.py中自定义的属性,以及包含的__开头与__结尾的特殊属性,自定义属性除了全局变量,还可以定义类,导入模块对象,定义函数,它们都会作为package对象的属性,你明白了吗?
module的属性有哪些?
1、内置函数dir(),不传入任何对象的时候,默认输出当前所在对象的属性,当我们在module中执行dir()函数时,它只会输出module对象的属性
if __name__ == "__main__":
print(dir())
输出结果:module对象下的有这些属性,可以看到一个我们最常见的属性,就是__name__,__name__是module对象的一个属性,你知道了吗?
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
2、让我们新增一行代码
import temp_package
if __name__ == "__main__":
print(dir())
再次运行模块,输出结果:我们发现list中多了temppackage,嘿嘿
[....忽略展示原有的...., 'temp_package']
5、module对象的这些属性?都是什么类型呢?只有属性名的情况下,我们如何知道他们的类型?当然可以,请看下面代码
import sys
import temp_package
print(dir())
current_module = sys.modules[__name__]
for index, ele in enumerate(dir()):
obj = getattr(current_module, ele)
print(str(index) + ": " + ele + "我的类型:" + str(type(obj)))
输出结果:值得注意的是,导入的package,仍然是module的一个对象,即它的类型是module(这里我们使用了内置函数enumerate、内置函数type)
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'sys', 'temp_package']
0: __annotations__我的类型:<class 'dict'>
1: __builtins__我的类型:<class 'module'>
2: __cached__我的类型:<class 'NoneType'>
3: __doc__我的类型:<class 'NoneType'>
4: __file__我的类型:<class 'str'>
5: __loader__我的类型:<class '_frozen_importlib_external.SourceFileLoader'>
6: __name__我的类型:<class 'str'>
7: __package__我的类型:<class 'NoneType'>
8: __spec__我的类型:<class 'NoneType'>
9: current_module我的类型:<class 'module'>
10: sys我的类型:<class 'module'>
11: temp_package我的类型:<class 'module'>
class对象有哪些属性呢?
class MyClass(object):
pass
print(dir(MyClass))
输出结果:这属性可真够多
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
1、向类中添加一个类方法(static方法)
class MyClass(object):
@classmethod
def test_class_method(cls):
pass
print(dir(MyClass))
再看属性:果然多了一个'test_class_method'
[.....忽略很多....., 'test_class_method']
2、再向类中添加一个实例方法,我们看下会成为类的属性吗?
class MyClass(object):
@classmethod
def test_class_method(cls):
pass
def test_instance_method(self):
pass
print(dir(MyClass))
输出结果:果然实例方法同样算做类的属性
MyClass.test_instance_method(MyClass()) #类名调用一个实例方法的时候,传递一个实例对象进去即可
[...省略很多原有的..., 'test_class_method', 'test_instance_method']
函数对象有哪些属性呢?让我们继续试一试
def my_function():
pass
print(dir(my_function))
输出结果:好多好多
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
你甚至可以这样为函数添加属性,first_val就是函数的一个属性
my_functioin.first_val=5
instance(实例对象)有哪些属性呢?
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
one_person = Person('wang yuan wai', 28)
print(dir(one_person))
输出结果:对象的属性也挺多的哦,我们自定义的实例变量name与age也在里面哦
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name']
method下有哪些属性呢?
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def print_name(self):
print(self.name)
one_person = Person('wang yuan wai', 28)
print(dir(one_person.print_name))
输出结果:也挺多的哦
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
总结
1、python中一切都是对象,对象,一定会有类型
2、类或者类型是对象的模板,它用于产生对象
3、对象也称为实例,或者实例对象
4、对象的属性,也称为对象的实例变量,或者成员变量
5、学不会没关系,收藏起来,多学几遍就明白了,面向对象很重要