草庐IT

Python方法与函数的区别

一心月 2024-07-14 原文

补充

函数:function,功能,代码包
方法:method,类函数 class function,generic function 泛函数,对象与生俱来的函数
另看到一篇文章的标题是《Excel200多个宏代码集,比函数强多了!有效提高工作效率!》,这里的函数是内置函数,经历了应用的洗礼和算法的优化的常用功能的代码包。而宏代码集是宏所用的解释器的支持下的自定义代码包,宏的名称就相当于自定义函数的代码名。

之前

《Python学习手册第五版上册》P216

方法是与特定对象相关联,并作用于特定对象的简单函数。
从技术的角度讲,他们是附属于对象的属性,而这些属性碰巧引用了可调用函数罢了,这些函数总是拥有一个隐含的主体(self)。
从更精细的角度看,函数就是代码包,而方法调用同时结合了两种操作:一次属性获取和一次函数调用。

方法是类内置的函数,与类相关联,无法单独调用,调用时通常都引用了类的一些属性
方法和函数都是人对其定义的概念,用于人对其功能的区分,并不会真的对使用有什么影响
类内置的方法必定要与类相关联,不然调用时会报错

type(str.__add__)
Out[1]: wrapper_descriptor # 封装_描述符

type(str.find)
Out[2]: method_descriptor # 方法_描述符

type('abc'.find)
Out[3]: builtin_function_or_method # 内置函数或方法

class Foo(object):
     def __init__(self):
         self.name="haiyan"
     def func(self):
         print(self.name)
     def f(): # 错误演示,下面会有报错
         pass

type(Foo) # 类
Out[28]: type

f=Foo()

type(f) # 类Foo的一个对象
Out[30]: __main__.Foo

type(Foo.f) # 当用类去描述时,这叫做函数
Out[14]: function

Foo.func()
TypeError: func() missing 1 required positional argument: 'self'

Foo.func(self)
NameError: name 'self' is not defined
# 以上正确定义的类内的方法,无法被类调用,其实类本身就不是这么用的,他就是要实现其他类以及该类的对象的

Foo.f()
# 但这个错误定义的函数却可以使用,但也仅能这样使用

type(f.f) # 当用对象去
Out[15]: method

f.name # 属性(对象,元素)
Out[31]: 'haiyan'

Foo.func # 来自于类的方法
Out[35]: <function __main__.Foo.func(self)>

f.func
Out[34]: <bound method Foo.func of <__main__.Foo object at 0x000001DFD280EAF0>>
# 绑定方法于类的函数,类的对象某某某

hex(id(f))
Out[37]: '0x1dfd280eaf0' # 应对上述对象的地址

f.func() # 运行方法
haiyan

f.f()
TypeError: f() takes 0 positional arguments but 1 was given
# 报错,原因是类中定义函数时,需要有一个参数self

总之,方法和函数的称谓只是方便我们使用,实际与运行为准

常规情况下,类内定义的函数需要增加self的参数,只能对象来调用它,而对于对象来说,他就是方法
非常规情况下,类内不使用self参数的函数可以用类直接调用,而对象无法调用它,会报错,他是仅能由类所调用的一个函数,实际应用可能会运算和现实与该类相关的运行环境等

class Foo(object):
     name='hi'
     def __init__(self):
         self.name="haiyan"
     def func(self):
         print(self.name)
     def f():
         print(Foo.name)

Foo.name
Out[46]: 'hi'

Foo.f
Out[47]: <function __main__.Foo.f()>

Foo.f()
hi

对象无法调用.f,因为对象自带.self属性/参数,这与.f的参数不符,总之带self参数的,类无法调用它,对象专用。不带self参数的,对象不能调用,类可以调用。
方法只是对对象而言,而对类而言,这些函数都是类的一个属性。能被对象调用的类的函数,对类的对象而言,就是方法,而不带self的类的函数,可以当作类自身的调试用功能,而与类的对象无关。

有关Python方法与函数的区别的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  6. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  9. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  10. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

随机推荐