本文作者:铝哥

基于Python __dict__与dir的区别详解

铝哥 2023-11-13 13:36:39

Python中的`__dict__`和`dir()`是两个常用的内置函数,用于获取对象的属性和方法信息,它们在功能和使用上有一些区别,下面将详细介绍它们的区别。

1. `__dict__`:

基于Python __dict__与dir的区别详解

`__dict__`是一个字典对象,它存储了对象的所有属性和方法信息,可以通过访问对象的`__dict__`属性来获取该字典对象。

   class MyClass:
       def __init__(self):
           self.name = "John"
           self.age = 25

      def say_hello(self):
           print("Hello!")

   obj = MyClass()
   print(obj.__dict__)
   

输出结果为:

   {'name': 'John', 'age': 25}
   

可以看到,`__dict__`返回了一个包含对象所有属性的字典。

2. `dir()`:

基于Python __dict__与dir的区别详解

`dir()`是一个内置函数,用于返回一个列表,其中包含了对象的所有属性和方法的名称,可以通过调用对象的`dir()`方法来获取该列表。

   class MyClass:
       def __init__(self):
           self.name = "John"
           self.age = 25

      def say_hello(self):
           print("Hello!")

   obj = MyClass()
   print(dir(obj))
   
   ['__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', 'say_hello']
   

可以看到,`dir()`返回了一个包含对象所有属性和方法名称的列表。

- `__dict__`返回的是一个字典对象,可以直接通过键值对的方式访问属性;而`dir()`返回的是一个列表,需要通过索引或迭代器来访问属性和方法。

基于Python __dict__与dir的区别详解

- `__dict__`只包含对象自身的属性和方法,不包括继承自父类的属性和方法;而`dir()`会返回对象自身以及继承自父类的属性和方法。

- `dir()`返回的列表中还包含了一些特殊方法和属性,如`__class__`、`__doc__`等,这些在`__dict__`中不会出现。

相关问题与解答:

问题1:如何判断一个属性是否是对象自身的属性?

可以使用`hasattr()`函数来判断一个属性是否是对象自身的属性。

class MyClass:
    def __init__(self):
        self.name = "John"
        self.age = 25
    def say_hello(self):
        print("Hello!")
    def say_goodbye(self):
        print("Goodbye!")
    def __private_method(self):
        print("This is a private method.")

obj = MyClass()
print(hasattr(obj, 'name'))  # True,表示obj有name属性
print(hasattr(obj, 'age'))  # True,表示obj有age属性
print(hasattr(obj, 'say_hello'))  # True,表示obj有say_hello方法
print(hasattr(obj, 'say_goodbye'))  # False,表示obj没有say_goodbye方法(未定义)
print(hasattr(obj, '__private_method'))  # True,表示obj有私有方法(虽然不能直接访问)

问题2:如何获取对象继承自父类的属性和方法?

可以使用`super()`函数来获取对象继承自父类的属性和方法。

class Father:
    def __init__(self):
        self.father_name = "Tom"
        self.father_age = 40
    def father_say_hello(self):
        print("Hello from father!")
    def father_say_goodbye(self):
        print("Goodbye from father!")
    def __private_father_method(self):
        print("This is a private method of father.")
        return "Private method result"
    def public_method(self):
        return "Public method result" + self.__private_father_method() + " more."
        # self.__private_father_method()可以正常访问父类的私有方法,因为super()函数会将父类的私有方法也传递给子类实例。

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享