python成员函数是什么意思,Python 中的数据成员有哪两类-两者有什么区别-

  python成员函数是什么意思,Python 中的数据成员有哪两类?两者有什么区别?

  Python的静态方法和类成员方法都可以被类或实例访问。这两者的概念不容易澄清,但还是有区别的:

  1)静态方法不需要传入self参数,类成员方法需要传入代表这个类的cls参数;

  2)从第1条来看,静态方法不能访问实例变量,类成员方法不能访问实例变量,但是可以访问类变量。

  3)静态方法有点像函数工具库,而类成员方法更接近Java面向对象概念中的静态方法。

  实现静态方法和类方法的两种方式

  1.Python 2.3之前和之后都是用staticmethod和classmethod类型对象包装器实现的。

  示例如下(注意印刷的说明):

  classMyClass:

  val1=Value1

  def__init__(self):

  self.val2=Value2

  defstaticmd():

  Print 静态方法,无法访问val1和val2

  smd=静态方法(staticmd)

  defclassmd(cls):

  Print class method,class: str(cls),val1: cls.val1 ,无法访问val2 的值

  Cmd=classmethod(classmd)执行:

  mc=MyClass()

  mc.smd()

  mc.cmd()

  MyClass.smd()

  MyClass.cmd()相关推荐:《Python教程》

  第二,在Python 2.4及以后的版本中,是用decorators实现的。

  装饰者使用@运算符,例如:

  classMyClass:

  val1=Value1

  def__init__(self):

  self.val2=Value2

  @静态方法

  defstaticmd():

  Print 静态方法,无法访问val1和val2

  @classmethod

  defclassmd(cls):

  Print class方法,class: str(cls),Val1: CLS。Val1 ,无法访问val2 的值无论以上两种方式中的哪一种,执行情况都是一样的。以第二种方式的执行结果为例分析如下:

  执行:

  g

  t;>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='Valuechanged'#改变实例变量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='ClassValuechanged'#改变类变量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++不同,实例是可以动态添加属性的,即实例的属性和类的属性不一定一样。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: