Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:
1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;
2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。
实现静态方法和类方法的两种方式
一、在Python 2.3及之前,用staticmethod和classmethod类型对象包装实现
例子如下(注意print里的说明):
class MyClass: val1 = 'Value 1' def __init__(self): self.val2 = 'Value 2' def staticmd(): print '静态方法,无法访问val1和val2' smd = staticmethod(staticmd) def classmd(cls): print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值' cmd = classmethod(classmd)
执行:
>>> mc = MyClass() >>> mc.smd() >>> mc.cmd() >>> MyClass.smd() >>> MyClass.cmd()
相关推荐:《》
二、在Python 2.4及之后,用装饰器(decorators)实现
装饰器使用@操作符,例子如下:
class MyClass: val1 = 'Value 1' def __init__(self): self.val2 = 'Value 2' @staticmethod def staticmd(): print '静态方法,无法访问val1和val2' @classmethod def classmd(cls): print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'
不管是以上两种方式中的哪一种,执行情况都是一样的,以方式二执行结果为例分析如下:
执行:
>>> mc = MyClass() # 实例化 >>> mc.staticmd() # 实例调用静态方法,无法访问实例变量val1和val2 >>>
静态方法,无法访问val1和val2
>>> mc.classmd() # 实例调用类方法,注意,这里访问的是类MyClass的变量val1的值,不是实例化后mc的实例变量val1, 这里容易混淆,往下看就会明白。val2一直是实例变量,所以无法访问 >>>
类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
>>> MyClass.staticmd() # 类直接调用静态方法,结果同上面的实例调用,无论是类变量还是实例变量都无法访问 >>>
静态方法,无法访问val1和val2
>>> MyClass.classmd() # 类直接调用类方法,结果同上面的实例调用 >>>
类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
>>> mc.val1 = 'Value changed' # 改变实例变量val1的值 >>> mc.classmd() # 实例调用类方法,注意到cls.val1的值没变,所以,这时的cls.val1是类变量val1,而非实例变量val1 >>>
类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
>>> MyClass.classmd() # 类直接调用类方法,结果同上面的实例调用 >>>
类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
>>> MyClass.val1 = 'Class Value changed' # 改变类变量val1的值 >>> mc.classmd() # 实例调用类方法,注意到cls.val1的值变了,所以,进一步证明了这时的cls.val1是类变量val1, 而非实例变量val1 >>>
类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值
>>> MyClass.classmd() # 类直接调用类方法,结果同上面的实例调用 >>>
类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值
结论
如果上述执行过程太复杂,记住以下两点就好了:
1. 静态成员方法:不能访问类属性,实例属性,相当于一个独立的方法,可以理解和类没关系,只是用类加了个作用域,比如:一个类,有三种加密算法,可以考虑静态方法;
2. 类成员方法:能访问类属性,无法访问实例属性,这里要注意,python是动态语言,和c++不同,实例是可以动态添加属性的,即实例的属性和类的属性不一定一样。
皓通汽车网还为您提供以下相关内容希望对您有帮助:
Python基础教程:3个方面理解Python的类方法与静态方法
Python中,理解类方法与静态方法的关键在于它们的定义、调用方式和归属。以下是它们的主要区别:1. 定义差异:成员方法直接使用def,无需装饰器;类方法需用@classmethod装饰,接收cls参数;静态方法则用@staticmethod,不接收额外参数。2. 调用方式:成员方法由类实例调用,第一个参数通常是self;类方法可由...
python中类的属性和方法的区别
在Python中,类的属性是描述类整体特征的数据成员,而类的方法则是实现类中特定功能的行为或操作。详细解释:类的属性 类的属性是描述类本身的数据元素。它们提供了关于类实例的共同特征的信息。这些属性通常是静态的,也就是说它们在类的所有实例之间共享相同的值。例如,如果我们有一个表示矩形的类,其...
python 为
首先,静态方法的一个显著特征是它不需要接收self参数,这与类成员方法不同,后者需要传入代表类的cls参数。这意味着在调用静态方法时,我们不需要创建类的实例,可以直接通过类名来调用。其次,静态方法的一个限制是它不能访问实例变量,这是与类成员方法的一个关键差异。类成员方法虽然也不能访问实例变...
Python中静态方法和类方法的区别
一、先是在语法上面的区别:1、静态方法不需要传入self参数,类成员方法需要传入代表本类的cls参数;2、静态方法是无妨访问实例变量和类变量的,类成员方法无法访问实例变量但是可以访问类变量 二、使用的区别:由于静态方法无法访问类属性,实例属性,相当于一个相对独立的方法,跟类其实并没有什么关系。这...
python类和函数的区别
一、主体不同 1、类:是面向对象程序设计实现信息封装的基础。2、函数:是指一段在一起的、可以做某一件事儿的程序。也叫做子程序、(OOP中)方法。二、特点不同 1、类:是一种用户定义的引用数据类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。2、函数...
如何在Python中使用static,class,abstract方法
·通过用C等语言编写扩展来提升Python应用程序的性能,或者通过使用多线程增强1/0相关的应用程序的能力;·学习Python中有关数据库的API,以及如何在Python中使用各种不同的数据库系统,包括MySQL、Postgres和SQLite。类成员方法无法访问实例变量但是可以访问类变量使用的区别:由于静态方法无法访问类属性,实例...
python类和函数的区别
python语言中类和函数的区别 1、规则不同 类是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型;函数必须声明后才可以被调用,调用格式为:函数名(实参)调用时函数名后的小括号中的实参必须和声明函数时的函数括号中的形参个数相同。2、主体不同 类是面向对象程序...
python类中成员方法定义时方法名后的圆括号中必须包含什么?
被白帝之光内容成员方法,第一个方法名后面括号必须包含钙元素
python中if语句的使用(比较、逻辑、成员、运算符,语句结构)
成员运算符如in和not in,用于检查一个值是否在另一个序列(如列表或元组)中。例如,若小写"kety"在names列表中,则输出存在。在Python中,if语句结构是通过缩进来定义代码块的,如简单的if...else结构,以及更复杂的if...elif...else和if的嵌套结构。记住,缩进规则是关键,否则可能导致语法错误。
Python中函数和类的用途有什么区别
python语言中类和函数的区别是什么?1、规则不同 类是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型;函数必须声明后才可以被调用,调用格式为:函数名(实参)调用时函数名后的小括号中的实参必须和声明函数时的函数括号中的形参个数相同。2、主体不同 类是面向对象...