python类中的范围令人惊讶的行为

时间:2011-04-13 11:00:23

标签: python oop

以下代码将导致执行print语句

class C1(object):

    print 'I am some code executing in C1'

    def method1(self):
        print 'I am method1'
    def method2(self):
        print 'I am method2'
        pass

我对此感到惊讶,因为我认为只有在实例化课程时才会执行,有人能解释这背后的想法吗?

2 个答案:

答案 0 :(得分:8)

我猜你的意思是打印'我是在C1中执行的代码'?

它是在创建类对象时打印的,在这种情况下,当你加载它声明的文件时会发生这种情况。这也是你放置类变量的地方(它可以在其他地方用作Python等价的静态变量)语言)。

如果您想拥有在创建实例时执行的代码,请将其放在__init__()

关于该主题的官方Python文档:http://docs.python.org/tutorial/classes.html#class-objects

答案 1 :(得分:2)

在Python中,类定义是可执行语句。

To quote the documentation

  

<强> 7.7。课程定义

     

类定义定义了一个类对象(请参阅标准类型层次结构部分):

classdef    ::=  "class" classname [inheritance] ":" suite
inheritance ::=  "(" [expression_list] ")"
classname   ::=  identifier
  

一堂课   definition是一个可执行语句。   它首先评估继承   列表,如果存在。中的每个项目   继承列表应该评估为a   类对象或类类型   允许子类化。班级套房   然后在新的执行中执行   框架(参见命名和   绑定),使用新创建的本地   命名空间和原始全局   命名空间。 (通常,套房   仅包含函数定义。)   当班级的套房结束时   执行,它的执行框架是   丢弃但其本地命名空间是   保存。 [4]然后是一个类对象   使用继承列表创建   基类和保存的本地   属性的名称空间   字典。类名绑定   这个类对象在原文中   本地命名空间。

     

程序员注:定义了变量   在类定义中是类   变量;他们是所有人共有的   实例。创建实例   变量,它们可以在方法中设置   with self.name = value。课堂和   实例变量是可访问的   通过符号“self.name”,和   实例变量隐藏了一个类   变量具有相同的名称时   以这种方式访问​​。类变量   例如,可以用作默认值   变量,但使用可变值   可能会导致意想不到的结果。   对于新式类,描述符可以   用于创建实例变量   具有不同的实施细节。

     

类定义,如函数   定义,可以用一个或多个包裹   更多装饰表达式。该   装饰者的评价规则   表达式与for相同   f是氟烃基; unctions。结果必须是一个类   对象,然后绑定到   班级名称。