为什么有些方法使用点符号而其他方法没有?

时间:2015-02-24 18:49:04

标签: python methods syntax

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

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

len()采取了一种措辞,但不会使用点符号:

>>> len("Help")
4
>>>"help".len()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'len'

同样地:

>>>"help".upper()
'HELP'
>>>upper("help")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'upper' is not defined

3 个答案:

答案 0 :(得分:15)

这里的关键词是方法。函数和方法之间存在细微差别。

方法

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

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

rufus = Dog()
rufus.bark() # called from the object

功能

函数是全局定义的过程:

def bark():
    print 'Woof woof!'

关于len函数的问题,全局定义的函数调用对象的__len__特殊方法。所以在这种情况下,这是一个可读性问题。

否则,当它们仅应用于某些对象时,方法会更好。应用于多个对象时,函数更好。例如,你怎么能大写一个数字?您不会将其定义为函数,您只能将其定义为仅在字符串类中的方法。

答案 1 :(得分:2)

你叫什么&#34;点符号&#34;是类方法,它们只适用于具有类实现者定义的方法的类。 len是一个内置函数,它接受一个参数并返回该对象的大小。一个类可以实现一个名为len的方法,如果它想要的话,但大多数都不会。内置len函数有一条规则,说明如果一个类有一个名为__len__的方法,它将使用它,所以这可行:

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

"help".upper正好相反。字符串类定义了一个名为upper的方法,但这并不意味着必须有一个名为upper的函数。事实证明upper模块中有string函数,但通常您不必仅仅因为实现了类方法而实现了额外的函数。

答案 2 :(得分:0)

这是函数方法之间的区别。如果您只是学习基础知识,则可以简单地接受这种区别的存在,并且最终您将了解它。

还在这里吗?实际上,这甚至都不难。在面向对象的编程中,在很多方面,方法优先于函数,因为这意味着一种类型的对象可以覆盖方法的版本,而不会影响系统的其余部分。

例如,让我们假设您有一种新型的字符串,当您呼叫.upper()时,重音字符应该失去其重音。这种类型的实例可以继承str的子类,并且在所有其他方面的行为完全相同,基本上是免费的;他们需要重新定义的只是upper方法(即使那样,也可能调用基类的方法,并且只有在处理带重音的小写字符时才更改逻辑)。如果您将期望标准str传递给这种新类型的对象,那么希望在字符串上运行的软件将继续运行,甚至不知道区别。

Python的设计原则是一切都是对象。这意味着您甚至可以为objectclass和{ {1}},即扩展或覆盖您的应用程序或平台的基本语言。

实际上,这是在Python 2中将type字符串引入该语言时发生的。许多应用程序软件仍然可以像以前一样正常工作,但是现在可以使用unicode实例,其中以前已经编写了处理unicode实例的代码。 (这种区别在Python 3中不再存在;或更确切地说,被称为str且几乎在所有地方都使用过的类型现在称为str,仅在您特别想处理不是文字。)

回到我们的新bytes方法,考虑相反的情况;如果upper只是标准库中的一个函数,您甚至会考虑如何修改需要upper才能表现出不同的软件?如果明天您的老板希望您为upper做同样的事情,该怎么办?这将是一项艰巨的任务,您必须在整个代码库中进行的更改很容易成为意大利面条结构,并且可能会引入一些细微的新错误。

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