繁体   English   中英

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

[英]Why do some methods use dot notation and others don't?

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

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

len()采用了一个arugment,但是不能使用点符号:

>>> 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

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

方法

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

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

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

功能

函数是全局定义的过程:

def bark():
    print 'Woof woof!'

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

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

你所谓的“点符号”是类方法,它们只适用于具有类实现者定义的方法的类。 len是一个内置函数,它接受一个参数并返回该对象的大小。 一个类可以实现一个名为len的方法,如果它想要,但大多数不需要。 内置len函数有一个规则,说如果一个类有一个名为__len__的方法,它将使用它,所以这适用:

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

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

这是函数方法之间的区别 如果您只是学习基础知识,可能只是接受这种差异存在,并且您最终会理解它。

还在? 实际上,它甚至都不难。 在面向对象的编程中,方法比许多事物的函数更受欢迎,因为这意味着一种类型的对象可以覆盖方法版本而不影响系统的其余部分。

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

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

实际上,当在语言中引入unicode字符串时,这发生在Python 2中。 许多应用程序软件继续像以前一样工作,但现在使用unicode实例,以前编写代码来处理str实例。 (这种差异在Python 3中不再存在;或者更确切地说,被称为str并且几乎在所有地方使用的类型现在称为bytes ,仅在您特别想要处理非文本数据时使用。)

回到我们新的upper方法,考虑相反的情况; 如果upper只是标准库中的一个函数,你怎么会考虑修改需要upper软件来表现不同? 如果明天你的老板要你来为他们做同样的lower 这将是一项艰巨的任务,你必须在整个代码库中进行的更改很容易倾向于意大利面结构,并且可能会引入微妙的新错误。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM