zoukankan      html  css  js  c++  java
  • python第十九天 关于方法,函数

    1.先从简单的函数说起

    1 from inspect import isfunction  导入判断是否是function
    2 
    3 def foo():pass                 定义了一个函数
    4 print(foo)                     <function foo at 0x105657e18>
    5 print(isfunction(foo))         True

    在python中, 第3行代码表示,  foo  就是一个变量,  foo 指向的地址是 函数具体的执行代码

    第4, 第5 行打印结果, foo 的变量类型 是 function

    为什么说 foo 是一个变量呢?

    用如下代码证明:

     1 from inspect import isfunction
     2 
     3 def foo():pass
     4 print(foo)
     5 print(isfunction(foo))
     6 
     7 foo = 'abc'                发现函数名 foo 可以被赋值, 所以 函数名 就是一个 变量名
     8 print(foo)                 abc
     9 print(type(foo))           <class 'str'>
    10 print(type(foo) is str)    True

    2. 在类中定义一个函数

     1 from inspect import isfunction
     2 
     3 class A:
     4     def foo(self):pass
     5 
     6 a1 = A()
     7 print(type(A.foo), isfunction(A.foo))       <class 'function'> True
     8 print(type(a1.foo), isfunction(a1.foo))     <class 'method'> False
     9 print(A.foo)                                <function A.foo at 0x1070eb378>
    10 print(a1.foo)                               <bound method A.foo of <__main__.A object at 0x105076208>>

     第7行打印结果显示,  A.foo 是 function, 是函数

     第8行打印结果显示, a1.foo 是 method, 是方法, 看第10行打印, 说明 foo 被 对象 a1 绑定了, 是 boud method

     这说明, 在python中, 类调用的函数,还是叫函数, 对象 调用的函数, 被区分为 绑定的方法

    why ???

    1 a1.foo()  对象调用,OK
    2 A.foo()   类名调用,报错. foo() missing 1 required positional argument: 'self'

    说明, 对象调用时, python, 默认 会 把 对象的地址, 当做实参 传给 形参 self

     而类名调用时,  没有实参, 传给形参,所以error. 

     细想一下, 也符合逻辑, 类名调用时, 传什么 给 self 也确实是个问题.

    所以,打印两者的id 不同, 就存在可能了

    1 print(id(A.foo))
    2 print(id(a1.foo))  因为对象调用, 默认多了一步, 把对象地址 当实参 的过程, 这个过程应该也是一步代码, 假想是:  a1.foo(a1)

      a1.foo() 之前 可能是  a1.foo(a1) 的封装   

    所以, 猜想 a1.foo 指向的是  a1.foo(a1) ,  而 a1.foo(a1) 指向的是  A.foo 

    结论 就是  A.foo 和 a1.foo id 是不同的

     
  • 相关阅读:
    如何正确记忆单词
    转:超级通用型分页存储过程
    Delphi报表开发ReportMachine的小计和总计的计算
    DELPHI编程用SQLDMO呈现带进度条的SQL Server数据库Databnse备份!
    datasnap 2010 心跳包,连接断开处理
    合并BPL包图文教程
    Borland DataSnap(MIDAS)三层架构编程中,主细表的处理方式
    网上摘的 杀进程函数
    为RB定制支持参数的自定义函数
    获取一个数据库中的所有表的名称、一个表中所有字段的名称
  • 原文地址:https://www.cnblogs.com/golzn2018/p/9562838.html
Copyright © 2011-2022 走看看