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参数就实现了实例和方法的绑定.


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

  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/thunderLL/p/7750785.html
Copyright © 2011-2022 走看看