在Python中使用面向协议的编程(POP)

时间:2018-08-17 12:18:57

标签: python python-3.x

最近,我在YouTube上观看了詹姆斯·鲍威尔(James Powell)的一次非常有趣的演讲(LINK,视频播放时间约为12分钟)。在他的PyData演讲中,他指出“ [...] Python数据模型是一种可以实现协议的方法”。他将自己的陈述与诱骗方法(例如__init____repr__等)的使用联系起来。

我使用Python进行编程已经有一段时间了,但是我还没有遇到过POP。该视频并没有真正定义它的含义。 python中的POP实际上是什么,在实践中如何使用?

2 个答案:

答案 0 :(得分:0)

python 是面向协议的,他可能是指以下内容的组合:

  1. Duck typing“如果它走路像鸭子,叫起来像鸭子,那它一定是鸭子”。与 C 或 C++ 之类的语言相比,您不太关心传递的对象的类型,而更关心对象提供的接口。我认为对象接口等同于其方法的总和或对象提供的协议。尽管打字现在是 Python 的一部分,因为 version 3.5 通过类型提示,鸭子打字在语言中根深蒂固,以至于 PEP 544 – 恰如其分地称为“协议:结构子类型(静态鸭子输入)”——在使用静态类型的同时将这个概念嵌入到语言中。

  2. 方法(== 协议)是 python 满足其操作符、标准函数甚至它的语法的手段:

    • 要使用像 a + b 这样的运算符,您需要为 __add__(self, other) 实现 a 方法
    • 为了满足 Sized 类型的要求从而提供标准的 len(…) 函数,您实现了 __len__ 方法
    • 要在像 a 这样的 for 循环中使用对象 for _ in a:,您需要实现它的 __iter__ 方法
    • 要在生成器表达式中使用 object an object,您还需要实现其 __next__ 方法
    • 要启用语法以在上下文中使用with A(…) as a:,您需要提供__enter____exit__方法

    作为程序员,我们通过为对象提供 corresponding protocol 来提供 Python 的标准包含方式。

  3. 在python中,一切都是对象,字符串、列表、函数甚至模块。上面显示的范例也适用于那里。原则上您可以添加函数,它们是第一类对象。函数本身有方法,也就是对象,所以它们也有方法,也就是对象,......

附加说明:我是在看了同一个演讲并绊倒同一个短语后发现了你的问题。我的印象是他的意思并不是“面向协议”这个词的字面意思,而是更通俗的意思。我认为以上三点证明了他的说法。

答案 1 :(得分:-1)

确定要流行吗 我想你的意思是 面向对象编程 像这样:

Class animal:
     def __init__(self, name, color):
          self.name = name
          self.color = color

Dog = animal(" huskey",  "black")
print(animal.name)
print(animal.color)