python函数以什么关键字定义,python在类中定义方法采用( )关键字

  python函数以什么关键字定义,python在类中定义方法采用( )关键字

  在学习python crawler之前,我不得不把函数封装到类中,写成类方法。我知道python的类方法中第一个参数应该是self,但我不知道self的具体含义。最近看Java,多学了一点面向对象编程,终于彻底明白了什么是自我。

  在Python中,所有的类都直接或间接地继承自Object类。定义一个类之后,就定义了一个名称空间,其中定义的属性可以被类名引用。新定义的类在Object中有一些属性,可以在其中定义其他变量或函数。实例化后,将创建一个对象,该对象脱胎于类,其属性与类中的属性动态关联:

  Class A: pass a=A()这段代码创建了一个类A并实例化了它。实例化的对象被绑定为变量A。我可以分别看到A和A中的内容:

  In[38]:dir(A)Out[38]:[ _ _ class _ _ , __delattr__ , __dict__ , __dir__ , __doc__ , __eq__ , __format__ , __ge__ , __getattribute__ , __gt__ , __hash__ ,_ _ init init _ subclass _ _ ,, __le__ , __lt

  in[40]:A . b-attribute error trace back(最近一次调用last)Iphon-input-40-ebc fc 7 DBF 31 A in module()-1 A . battribute error:type object A 在[41]中没有属性 b :A . b=1现在我们可以看到A和A中的属性发生了什么变化:

  In[42]:dir(A)Out[42]:[ _ _ class _ _ , __delattr__ , __dict__ , __dir__ , __doc__ , __eq__ , __format__ , __ge__ , __getattribute__ , __gt__ , __hash__ ,_ _ init init _ subclass _ _ ,, __le__ , __lt

  如果我们向实例化的对象添加属性会怎么样:

  In [44]: a.c=2In [45]: hasattr(a,c) - NameError Traceback(最近一次调用last)Iphon-input-45-15d 927 C 71e 90 in module()-1 has attr(a,c) nameerror:名称 C 未定义实际报告了一个错误,C未定义。错误的原因是A的实例化对象A的命名空间中有C,但公共命名空间中没有C,我们再试一次:

  In [58]: c=a.cin [59]: hasattr (a, C )out[59]:true in[60]:has attr(A, c) out [60]: false我们可以看到A中有C,但是A中没有C,是不是因为C指向a.c,所以A中就没有这个东西:

  In [61]: b=a .实用计算机[62]: hasattr (a, b) out [62]: true真的是因为在类的实例化对象中添加的属性不会被添加到类中。

  接下来,让我们看看向或添加函数属性时会发生什么:

  in[78]:a . foo=lambda x:x 1In[79]:A.foo(1)Out[79]:2In[80]:a . foo(1)-type error trace back(最近一次调用last)ipython-input-80-7 DC 85 FD 7 a 693 in module()-1 a . foo(1)type error:lambda()中的self关键字取1个位置参数但给定2个python方法函数在执行 a . foo(1)语句时出错,说只有一个参数这第二个参数是怎么来的?为什么A.foo(1)不会出错?在这里,我们可以引出python类中的方法函数。方法函数是指通过类的实例化对象调用的函数。方法函数的第一个参数表示类的实例化对象,通常写成self。执行a.foo(1)相当于执行A.foo(a,1)。因为A.foo()中只有一个形参,传入的形参比要求的多,所以出现了类型错误。

  我们在A的定义中重新定义foo:

  Class: def foo (self,n):print(n ^ 1)a=a()现在我们在a:

  在[85]: A.foo(1)2中我们也可以尝试调用A.foo:

  在[86]: A.foo(a,1)2总结在python的类中定义函数时的self关键字与python的方法函数有关。方法函数由类的实例化对象调用,调用它的实例化对象需要传入方法函数。self是表示实例化对象的形参。

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

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