基于Python __dict__与dir的区别详解

admin3个月前网络知识42

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

1. `__dict__`:

基于Python __dict__与dir的区别详解-图1

`__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的区别详解-图2

`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的区别详解-图3

- `__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()函数会将父类的私有方法也传递给子类实例。
免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

浅谈Python由__dict__和dir引发的一些思考「python中的dict」

浅谈Python由__dict__和dir引发的一些思考「python中的dict」

Python中的`__dict__`和`dir()`是两个非常常用的内置函数,它们在Python的面向对象编程中起着重要的作用,本文将深入探讨这两个函数的作用、用法以及一些相关的思考。我们来了解一下`...