为什么我们需要python中的每个方法对应的类函数?

Why we need corresponding class function with each method in python?

我在python中学习oop,并遵循这个和这个stackoverflow答案以及这个帖子。

我知道类是如何工作的,方法是如何调用的,以及所有事情,但我有一些疑问:

考虑一下这段代码:

ZZU1

正如我在教程中看到的:

BLCK1

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

类.甲基(obj,args)?什么?

就像我们称距离为点距离一样,它成为"自我"的原因。当我们叫a.bye时,它就变成了point.bye(a)"self"的原因。

当每个方法都需要点类时,如果我们不将点类用于每个方法,会发生什么?

为什么它不能只是冰毒(obj,args)起作用?

我主要怀疑的是为什么它被称为类。当我们用方法的属性调用时,每个方法都有一个方法。为什么每个人都需要电话?

如果我理解正确,那么它是必要的,因为每个方法都可以访问其他方法的数据,比如变量和东西?


关键是

python internally converts it for you

从你的角度来看:

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

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

编辑1如果我正确理解了您的问题,您会问为什么当Python已经有了可用的实例,并且实例知道自己的类型时,它需要知道类。实际上,python总是基于实例获取方法。我认为本教程的重点是,在Python中,类是定义函数的主要地方。这与一些面向对象的语言不同,在这些语言中,每个实例都有自己的方法,并且它们之间可能完全不同。因此,本教程将对比Python中的常用方法:

1
2
3
class Foo:
    def bar(self):
        pass

有一个替代方案(在Python中可能,但不是典型的):

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

edit 2 python方法通常位于类中,而不是实例中。即使创建1000个Point对象,也只有一个Point.distance实际指令字节的副本。这些指令字节在调用.distance()时执行。正确的做法是,self参数是这些指令字节如何知道要处理哪个实例,以及该方法如何访问所传递实例中的其他数据。

edit 3 self并不像本地与全局那样是一个名称空间。但是,公平地说,self.foo指的是当前类的这个实例的所有方法都确实可以访问的foo。鉴于

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

Point.distance呼叫中,selfab,但不指两者。所以当你打电话给a.distance()时,self.xa.x而不是b.x。但是Point的所有方法都可以访问self.x,得到当前点的x是什么。

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

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

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

然后你可以说:

1
point_distance(a)

以获得

1
print (a['x'])

类基本上就是这样做的,语法更清晰,并且有一些好的好处。但是,正如point_distance()Point参数每次调用point_distance()时仅指一个点式字典一样,self参数每次调用Point.distance()时仅指一个Point实例。


因为您可以在不同的类中使用相同的方法名,它需要调用适当的方法名。所以如果你有

1
2
3
4
5
6
7
8
9
10
11
12
class Class1:
    def meth():
        print"This is Class 1"

class Class2:
    def meth():
        print"This is Class 2"

c1 = Class1()
c2 = Class2()
c1.meth() # equivalent to Class1.meth(c1)
c2.meth() # equivalent to Class2.meth(c2)

如果把c1.meth()转换成meth(c1),系统就无法知道该调用哪个meth()函数。


类定义了它们的所有实例的共同点。通常这是包含其每个方法的代码。要将此代码应用于正确的实例对象,语言将解释

1
instance.method(arg1, arg2, ...)

作为

1
class_of_instance.method(instance, arg1, arg2, ...)

所以代码被应用到适当的类实例。