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
只在函数内部可见。