Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么有些方法使用点符号,而另一些方法不使用';T_Python_Methods_Syntax - Fatal编程技术网

Python 为什么有些方法使用点符号,而另一些方法不使用';T

Python 为什么有些方法使用点符号,而另一些方法不使用';T,python,methods,syntax,Python,Methods,Syntax,所以,我刚刚开始学习Python(使用Codecademy),我有点困惑 为什么有些方法使用参数,而有些方法使用点符号 len()接受一个arumment,但不适用于点表示法: >>> len("Help") 4 >>>"help".len() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' ob

所以,我刚刚开始学习Python(使用Codecademy),我有点困惑

为什么有些方法使用参数,而有些方法使用点符号

len()接受一个arumment,但不适用于点表示法:

>>> len("Help")
4
>>>"help".len()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'len'
>>len(“帮助”)
4.
>>>“帮助”
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“str”对象没有属性“len”
同样地:

>>>"help".upper()
'HELP'
>>>upper("help")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'upper' is not defined
>>“help”.upper()
“救命”
>>>上部(“帮助”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“upper”

这里的关键词是方法。函数和方法之间有细微的区别

方法 是在给定对象的类中定义的函数。例如:

class Dog:
    def bark(self):
        print 'Woof woof!'

rufus = Dog()
rufus.bark() # called from the object
作用 函数是一个全局定义的过程:

def bark():
    print 'Woof woof!'
至于您关于
len
函数的问题,全局定义的函数调用对象的
\uuu len\uuu
特殊方法。所以在这个场景中,这是一个可读性问题

否则,当方法仅应用于某些对象时,效果更好。函数应用于多个对象时效果更好。例如,如何将数字大写?您不会将其定义为函数,而是将其定义为仅在string类中的方法

您所谓的“点表示法”是类方法,它们仅适用于具有类实现者定义的方法的类
len
是一个内置函数,它接受一个参数并返回该对象的大小。一个类可以实现一个名为
len
的方法,如果它愿意的话,但大多数都没有。内置的
len
函数有一条规则,规定如果一个类有一个名为
\uuuu len\uuuuu
的方法,它将使用该方法,因此:

>>> class C(object):
...     def __len__(self):
...             return 100
... 
>>> len(C())
100

“帮助”。上面的
则相反。string类定义了一个名为
upper
的方法,但这并不意味着也必须有一个名为
upper
的函数。事实证明,
字符串
模块中有一个
上限
函数,但通常不必仅仅因为实现了类方法就实现额外的函数。

这就是函数和方法之间的区别。如果你只是在学习基础知识,也许你可以简单地接受这种差异的存在,并且你最终会理解它

还在这儿吗?事实上,这并不难。在面向对象编程中,方法在许多方面优于函数,因为这意味着一种类型的对象可以重写其方法版本,而不会影响系统的其余部分

例如,让我们假设您有一种新的字符串,当您调用
.upper()
时,重音字符应该会失去重音。这种类型的实例可以子类化
str
,在其他方面表现完全相同,基本上是免费的;他们需要重新定义的只是
upper
方法(即使这样,也可能调用基类的方法,并且只在处理重音小写字符时更改逻辑)。而那些希望处理字符串的软件只会继续工作,而且如果你传入一个新类型的对象,其中需要一个标准的
str
,它甚至不知道有什么不同

Python中的一个设计原则是一切都是对象。这意味着您甚至可以为基本的基本对象(如
对象
、和
类型
)创建自己的替换,即扩展或覆盖应用程序或平台的基本语言

事实上,在Python2中,当
unicode
字符串被引入该语言时,这种情况就发生了。许多应用软件仍然像以前一样工作,但现在使用的是
unicode
实例,以前编写的代码用于处理
str
实例。(这种差异在Python 3中不再存在;或者更确切地说,被称为
str
的类型现在被称为
bytes
,并且只在您特别想要处理非文本数据时使用。)

回到我们新的
upper
方法,考虑相反的情况;如果
upper
只是标准库中的一个函数,您甚至会如何考虑修改需要
upper
以实现不同行为的软件?如果明天你的老板想让你为
更低的人做同样的事,那该怎么办?这将是一项巨大的任务,您必须在整个代码库中进行的更改将很容易趋向于意大利面结构,并且可能会引入一些微妙的新错误


这是面向对象编程的基石之一,但只有在更结构化的介绍中学习其他两三条原则时,它才可能真正有意义。就目前而言,可能快速而肮脏的总结是“方法使实现模块化和可扩展。”

Guido在这里解释道:因此,在我上面的示例中,len()是一个全局函数,而upper()是string类的方法?您并没有真正讨论特定于类的函数与具有参数的函数。Fish,这是正确的。方法仅适用于某些对象时效果更好。函数应用于多个对象时效果更好。例如,如何将数字大写。您可以将其定义为一个函数,您可以将其定义为一个字符串方法。@MalikBrahimi您可以
lower()
一个起重机,您可以
lower()
一个字符串,但它是一个方法。事实是,Python开发人员在定义
len()
和其他类似函数时犯了一个错误;如果我们最终定义了
\u len\u()
,为什么不首先使用
len
方法呢?@MalikBrahimi也不是所有对象都实现
\u len\u()
,例如,你不能
len()
一个整数。打赌没什么区别