python类中函数的变量

  • Post category:Python

Python中的类中的函数包含了函数定义时的参数以及类定义时默认参数,这些参数统称为函数的变量。在类中定义函数时,常常需要考虑函数的作用域和参数传递,同时还要注意类方法和实例方法的区别。下面将详细介绍Python类中函数的变量。

函数变量的作用域

在Python中,函数定义时的参数以及类定义时的默认参数均具有函数作用域(function scope),即函数内的变量只在当前函数内部可见。例如,下面的代码定义了一个包含默认参数的类TestClass

class TestClass:
    def __init__(self, param1='default_param1'):
        self.param1 = param1

    def func(self, param2='default_param2'):
        print('Param1: {}'.format(self.param1))
        print('Param2: {}'.format(param2))

上述代码中,func()函数中的param2只在函数内部可见。这意味着,如果我们在函数外部访问func()函数中的变量,将会抛出NameError异常:

>>> test=TestClass()
>>> print(test.param1)
default_param1
>>> print(param2)  # 抛出 NameError 异常
NameError: name 'param2' is not defined

类方法和实例方法

在Python中,类方法和实例方法的定义方式不同,并且它们各自拥有不同的函数变量。

类方法可以使用@classmethod装饰器定义,类方法的第一个参数必须是cls,用来指代当前类本身。在类方法中,可以调用类变量和类函数。例如:

class TestClass:
    class_var = 'class_var_init'

    def __init__(self, instance_var='instance_var_init'):
        self.instance_var = instance_var

    @classmethod
    def class_func(cls, class_param='default_class_param'):
        print('ClassParam: {}'.format(class_param))
        print('ClassVar: {}'.format(cls.class_var))

上述代码中,函数class_func()为类方法,用@classmethod装饰器进行修饰,参数列表中包含一个名为cls的参数,指代当前类本身。在函数中,可以使用cls.的方式访问类变量和类函数:

>>> test=TestClass()
>>> TestClass.class_func('non-default_class_param')
ClassParam: non-default_class_param
ClassVar: class_var_init

实例方法不需要类似于类方法的第一个参数cls,而是需要一个名为self的参数,用于访问实例变量和实例函数。实例方法可以通过在函数定义中省略@classmethod装饰器进行定义。例如:

class TestClass:
    class_var = 'class_var_init'

    def __init__(self, instance_var='instance_var_init'):
        self.instance_var = instance_var

    def instance_func(self, instance_param='default_instance_param'):
        print('InstanceParam: {}'.format(instance_param))
        print('InstanceVar: {}'.format(self.instance_var))

上述代码中,函数instance_func()为实例方法。在函数中,通过参数列表的第一个参数self,可以使用对象中的实例变量和实例方法:

>>> test=TestClass()
>>> test.instance_func('non-default_instance_param')
InstanceParam: non-default_instance_param
InstanceVar: instance_var_init

示例代码

下面是一个完整的示例代码,介绍了Python类中函数变量的作用域、类方法和实例方法的定义方式,以及如何在函数中使用函数变量:

class MyClass:
    class_var = 'class_var_init'

    def __init__(self, instance_var='instance_var_init'):
        self.instance_var = instance_var

    @classmethod
    def class_func(cls, class_param='default_class_param'):
        print('ClassParam: {}'.format(class_param))
        print('ClassVar: {}'.format(cls.class_var))

    def instance_func(self, instance_param='default_instance_param'):
        print('InstanceParam: {}'.format(instance_param))
        print('ClassVar: {}'.format(self.class_var))
        print('InstanceVar: {}'.format(self.instance_var))

    def func_with_local_var(self):
        local_var = 'func_local_var_init'
        print('LocalVar: {}'.format(local_var))

test = MyClass()

test.class_func('non-default_class_param')
test.instance_func('non-default_instance_param')
test.func_with_local_var()

输出结果如下:

ClassParam: non-default_class_param
ClassVar: class_var_init
InstanceParam: non-default_instance_param
ClassVar: class_var_init
InstanceVar: instance_var_init
LocalVar: func_local_var_init

本示例代码中,定义了一个名为MyClass的类,其中包含类变量class_var,实例变量instance_var,类方法class_func(),实例方法instance_func(),以及带有局部变量的函数func_with_local_var()

在使用示例中定义的函数时,可以看出类函数和实例函数各自具有不同的函数变量作用域,不同的调用方式;而func_with_local_var()函数中的local_var只在函数内部可见。