V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Matrix24
V2EX  ›  Python

Python 类中实例变量和类变量还有类内定义的函数,它们之间作用域是怎样的,变量之间的关系是怎样?

  •  
  •   Matrix24 · 2014-03-02 10:30:31 +08:00 · 6427 次点击
    这是一个创建于 3709 天前的主题,其中的信息可能已经有所发展或是发生改变。
    10 条回复    1970-01-01 08:00:00 +08:00
    gaicitadie
        1
    gaicitadie  
       2014-03-02 11:05:53 +08:00 via iPad   ❤️ 1
    跑个题,关注这些偏门的知识点真的很无聊,如同ruby的元编程,php的切面编程。除了面试别人或被人面试的时候拿出来装个逼,平时开发真的用不到这些知识点
    binux
        2
    binux  
       2014-03-02 11:45:04 +08:00   ❤️ 2
    实例变量和类变量,哪有什么作用域?你哪次不是self.foo这样访问的?
    zorceta
        3
    zorceta  
       2014-03-02 12:02:17 +08:00
    likexian
        4
    likexian  
       2014-03-02 12:15:56 +08:00
    好多名词,一个也不懂,怎么办
    Matrix24
        5
    Matrix24  
    OP
       2014-03-02 14:47:22 +08:00
    Matrix24
        6
    Matrix24  
    OP
       2014-03-02 15:05:58 +08:00
    hitsmaxft
        7
    hitsmaxft  
       2014-03-02 22:38:16 +08:00   ❤️ 1
    实例变量和类变量这些基础的知识还偏门? 某些朋友不能误人子弟啊.

    然后, 这些任何一本python书里都有,请仔细看下class相关内容.

    http://docs.python.org/3/tutorial/classes.html 官方的说法

    http://woodpecker.org.cn/diveintopython/object_oriented_framework/class_attributes.html 一篇中文的, 粗略喵了一眼, 应该没什么硬伤.

    我能说的只有这些, 你懂的.
    hitsmaxft
        8
    hitsmaxft  
       2014-03-02 22:40:27 +08:00
    @binux 一个实例没创建之间, 哪有实例变量可以访问?

    能问这种问题, 相必是基础知识不牢靠的, 问题本身可能就是错的
    Hualin
        9
    Hualin  
       2014-03-03 00:58:12 +08:00
    Python 中除了基本类型(int,str,float)这种的,其他 list,dict,object 等作为函数参数都会传其引用(在函数里如果改了,不用 return,除了函数,那个变量里面的内容已经变了),除非明显给出 copy()。而且这些类型有时在用被某些函数用个之后 类型会变成其子类。比如 dict 会变成 local (可以当做 dict 用,但比 dict 更特别一些)。

    和 C++ java 等 不同,Python 没有块作用域。在 for loop 和 if block 里定义的变量出去后 还可以访问。

    类成员变量,方法 没啥特别,用起来跟其他语言感觉一样,引用都要 self.xxx

    我没查文档,以上是个人经验。
    yfaming
        10
    yfaming  
       2014-03-12 17:30:03 +08:00
    参考一下 http://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy,3.2 节 "The standard type hierarchy" 下 Classes 和 Class instances 两段。

    简单说,每个类维护着一个字典叫 __dict__,里面保存类的变量,方法,类方法,静态方法等;每个实例也维护个着字典叫 __dict__,里面保存实例的变量。

    通过类来访问属性,如 C.x,首先到类 C 的 __dict__ 里查找,看有没有 'x' 键,若没有则按继承树查找 C 的基类们。

    通过实例来访问属性,如 a.x,首先到 a 的 __dict__ 里查找,然后到 a 的类及其基类们的 __dict__ 里查找,方法如上。

    没找到,自然抛 AttributeError 异常了。找到了呢,有个 "transform" 的过程,见链接吧。也可暂忽略之,不去管什么 unbound method, bound method, classmethod, staticmethod 什么的。


    这里没有作用域什么事,只是有个屏蔽的问题。比如,类的 __dict__ 里有个 x,其实例的 __dict__ 里也有个 x,那么,通过实例访问 x 自然是取实例的 x 而通过类访问 x 就取了类的 x。

    要小心的是,类有个 x 而实例没有,执行 a.x = 2 时(a 是实例),则会在实例 a 的 __dict__ 里添加 x,而不是修改类的。

    -----------------------

    另外,链接那个文档也指出了,其实有很多 hooks 来拦截 C.x 和 a.x 这样的访问的,比如 @property,descriptor 什么的,这些是更“高级”一点的内容了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2873 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:26 · PVG 11:26 · LAX 20:26 · JFK 23:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.