Python 内置函数dir()与对象的特殊属性以及一切都是对象的轻谈

本文借助Python内置函数dir(),探究不同级别对象的属性。介绍了Python有package、module、class等对象,详细分析了各对象属性,如package属性包含__init__.py自定义属性和特殊属性,还强调Python是面向对象语言,面向对象编程很重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

    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、学不会没关系,收藏起来,多学几遍就明白了,面向对象很重要

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值