为什么我们在python中的每个方法上都需要相应的类函数?

le

我正在学习python中的OOP,并遵循stackoverflow答案以及此帖子

我了解类的工作方式以及方法的调用方式以及所有其他方面,但是我有一些疑问:

考虑以下代码片段:

class Point(object):
    def __init__(self,x,y):
        self.x = x
        self.y = y


    def distance(self):
         print (self.x)

    def bye(self):
        print(self.y)

a=Point(1,2)
a.distance()
a.bye()

正如我在教程中阅读的那样:

当我们调用带有某些参数的方法时,通过将方法的对象放在第一个参数之前来调用相应的类函数。因此,像obj.meth(args)之类的东西都会变成Class.meth(obj,args)。

调用ObjectA.methodA(arg1,arg2)时,python在内部将其转换为:

ClassA.methodA(对象,arg1,arg2)

现在我的困惑是为什么程序需要使用每个方法调用类?

Class.meth(obj,args)??

就像当我们调用a.distance时,它成为Point.distance(a)导致“自我”的原因一样,当我们调用a.bye时,它成为Point.bye(a)导致“自我”的原因。

当每个方法都需要Point类时,如果我们不对每个方法都使用Point类,会发生什么?

为什么不能简单地meth(obj,args)起作用?

我的主要疑问是,当我们使用method的attribute进行调用时,为什么每个方法都调用class.some_method。为什么它的需求与每个人都呼唤?

#如果我理解正确,那么它是必要的,因为这样每个方法都可以访问其他方法的数据,例如变量和填充物?

x

关键是

python内部为您转换

从您的角度来看:

  • meth(self, args)是用于定义成员函数的语法
  • obj.meth(args)是用于调用成员函数的语法

meth(obj,args)选项是这样的程序语言。这通常是实现的工作方式,但是将调用表示为时,obj.meth(args)将焦点放在对象上,并使读取使用的数据值(对象实例)更容易。

编辑1如果我正确理解了您的问题,您在问为什么Python在已有实例可用且实例知道其自身类型情况下需要知道该类实际上,Python始终基于实例获取方法我认为本教程的重点是在Python中,是定义函数的主要位置。这与某些面向对象的语言不同,后者的每个实例都有其自己的方法,并且它们可能彼此完全不同。因此,本教程对比了Python中的常规方法:

class Foo:
    def bar(self):
        pass

以及其他选择(可能在Python中,但不是典型的):

foo = object()   # an empty instance
foo.bar = lambda self: pass

编辑2个Python方法通常存在于类中,而不存在于实例中。即使您创建了1000个Point对象,也只有一份实际指令字节的副本Point.distance这些指令字节在任何时候都被执行<some point variable>.distance()您是正确的,该self参数是那些指令字节如何知道要在哪个实例上工作以及该方法如何访问传递的实例中的其他数据。

self与本地和全局不同,Edit 3并不完全是一个名称空间。但是,可以公平地说,它是self.foo指对于当前类foo该实例的所有方法而言确实可以访问的a 给定

a = Point(1,2)
b = Point(3,4)

Point.distance通话中,self是指ab,但不是两者都所以当你打电话时a.distance()self.xa.x不会的b.x但是所有的方法都Point可以获取self.x当前点x

编辑4假设您没有使用对象,而是使用字典:

a = {'x':1, 'y':2}  # make a "point"
b = {'x':3, 'y':4}  # make another

def point_distance(point):
    print (point['x'])

那么你可以说:

point_distance(a)

得到效果

print (a['x'])

类基本上可以做到这一点,语法更简洁,并且有一些不错的好处。但正如point参数point_distance()指的是一个且只有一个点状的字典你打电话,每次point_distance()self参数Point.distance()是指一个且只有一个Point实例每次通话时间<whatever point>.distance()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们在Delphi中创建的每个类都需要具有析构函数吗?

来自分类Dev

为什么我们需要Java中的Properties类?

来自分类Dev

为什么我们需要Python中的属性?

来自分类Dev

为什么我们需要在ASP.NET MVC中调用父类的空虚方法

来自分类Dev

为什么我们需要visibleCells函数(UICollectionView)

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

为什么我们需要在MSIL中显式调用父构造函数?

来自分类Dev

为什么我们需要在JavaScript中定义构造函数

来自分类Dev

为什么我们需要在React Hook中返回一个函数?

来自分类Dev

为什么我们需要 & 在 boost 中的绑定成员函数?

来自分类Dev

为什么我们需要在实体中声明非空构造函数?

来自分类Dev

在 Spark Window 函数中,为什么我们需要在最后使用 drop()

来自分类Dev

Firebase:为什么我们需要bindTo方法?

来自分类Dev

为什么我们需要使用AsEnumerable()方法?

来自分类Dev

为什么我们需要 Buffer.isBuffer 方法?

来自分类Dev

为什么我们需要Clojure中的'in(require'[...]])?

来自分类Dev

为什么我们需要MapReduce中的“地图”部分?

来自分类Dev

为什么我们在MongoDB中需要created_at

来自分类Dev

为什么我们需要纯<?>在Java中?

来自分类Dev

为什么我们在Typescript中需要任何类型?

来自分类Dev

为什么我们需要Kubernetes中的服务帐户?

来自分类Dev

C ++:在类分配运算符函数中,为什么我们必须返回* this

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们需要IO?

来自分类Dev

为什么在C#方法中我们需要多个`await`语句?

来自分类Dev

Java:为什么我们可以从非子类访问字段和方法时需要扩展类

来自分类Dev

JAVA-ThreadPoolExecutor 为什么我们需要在recheck过程中判断execute函数中的worker数量?

来自分类Dev

为什么我们需要抽象类而不是虚拟类?

Related 相关文章

  1. 1

    我们在Delphi中创建的每个类都需要具有析构函数吗?

  2. 2

    为什么我们需要Java中的Properties类?

  3. 3

    为什么我们需要Python中的属性?

  4. 4

    为什么我们需要在ASP.NET MVC中调用父类的空虚方法

  5. 5

    为什么我们需要visibleCells函数(UICollectionView)

  6. 6

    为什么我们需要在Linux上挂载?

  7. 7

    为什么我们需要在Linux上挂载?

  8. 8

    为什么我们需要在MSIL中显式调用父构造函数?

  9. 9

    为什么我们需要在JavaScript中定义构造函数

  10. 10

    为什么我们需要在React Hook中返回一个函数?

  11. 11

    为什么我们需要 & 在 boost 中的绑定成员函数?

  12. 12

    为什么我们需要在实体中声明非空构造函数?

  13. 13

    在 Spark Window 函数中,为什么我们需要在最后使用 drop()

  14. 14

    Firebase:为什么我们需要bindTo方法?

  15. 15

    为什么我们需要使用AsEnumerable()方法?

  16. 16

    为什么我们需要 Buffer.isBuffer 方法?

  17. 17

    为什么我们需要Clojure中的'in(require'[...]])?

  18. 18

    为什么我们需要MapReduce中的“地图”部分?

  19. 19

    为什么我们在MongoDB中需要created_at

  20. 20

    为什么我们需要纯<?>在Java中?

  21. 21

    为什么我们在Typescript中需要任何类型?

  22. 22

    为什么我们需要Kubernetes中的服务帐户?

  23. 23

    C ++:在类分配运算符函数中,为什么我们必须返回* this

  24. 24

    我们为什么需要容器?

  25. 25

    为什么我们需要IO?

  26. 26

    为什么在C#方法中我们需要多个`await`语句?

  27. 27

    Java:为什么我们可以从非子类访问字段和方法时需要扩展类

  28. 28

    JAVA-ThreadPoolExecutor 为什么我们需要在recheck过程中判断execute函数中的worker数量?

  29. 29

    为什么我们需要抽象类而不是虚拟类?

热门标签

归档