zoukankan      html  css  js  c++  java
  • Python 由__dict__和dir()引发的一些思考

    关于__dict__和dir()的区别和作用请参考这篇文章:http://blog.csdn.net/lis_12/article/details/53521554
    说下我当时遇到的问题:

    class Demo:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def func(self):
            print('Hello {0}'.format(self.name))
    
    >>> d1 = Demo('Pythoner', 24)
    >>> hasattr(d1, 'func')
    True
    >>> d1.__dict__
    {'age': 24, 'name': 'Pythoner'}
    >>dir(d1)
    [ 'age', 'func', 'name','__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__']
    

    首先,我们知道实例方法也可以算作是属性,通过hasattr()函数可以验证.而 __dict__是用来存储对象属性的一个字典,但是它的返回值中并没有'func'!
    再看dir()函数,它会自动寻找一个对象的所有属性(包括从父类中继承的属性),它的返回值中有'func'.
    所以我推测,"实例方法"并不属于实例的"私有"属性,而是该类的所有实例所共享的属性!
    实例得到私有属性需要一个"私有化"的过程,就像__init__初始化函数!
    验证:

    class Demo2:
        def __init__(self, name):
            self.name = name
    
        def func(self):
            print('----get arg country----')
            self.country = 'China'
    
    >>> d2 = Demo2('Pythoner')
    >>> d2.__dict__
    {'name': 'Pythoner'}
    >>> d2.func()
    ----get arg country----
    >>> d2.__dict__
    {'country': 'China', 'name': 'Pythoner'}
    

    "实例方法"之所以被称为实例方法,或者说每个实例执行实例方法会因为各自私有属性的不同而产生不同的结果,是因为方法中的self参数.
    实例在执行实例方法时会在其所属的类中寻找该方法,然后通过self参数将实例本身传递进去,实例的私有属性就一并进行了传递.通过self参数就实现了实例和方法的绑定.


    以上内容均为个人理解,如有误区请指点,万分感谢!

  • 相关阅读:
    CentOS 6.5 安装 VNC Server
    vs2008出错
    MySQL 尽量避免使用 TIMESTAMP
    excel中生成32位随机id
    库存扣减和锁
    精通 MySQL 索引
    Java代码性能优化
    RocketMQ 消息丢失场景分析及如何解决
    Java 8 的内存结构
    Spring Boot + MyBatis + MySQL 实现读写分离
  • 原文地址:https://www.cnblogs.com/thunderLL/p/7750785.html
Copyright © 2011-2022 走看看