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

时间:2016-11-03 01:05:51

标签: python python-2.7 class python-3.x oop

我在python中学习OOP并遵循thisthis stackoverflow答案和this post

我理解班级如何运作以及方法如何调用以及所有事情,但我有一些疑问:

考虑这段代码:

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,   参数)。

     

当调用ObjectA.methodA(arg1,arg2)时,python在内部转换   它适合你:

     

ClassA.methodA(ObjectA,arg1,arg2)

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

Class.meth(obj,args)??

就像我们调用a.distance一样,它变成了Point.distance(a)“self”的原因 当我们打电话给它时,它会成为Point.bye(a)“自我”的原因。

如果我们不使用每个方法的Point类,那么每个方法都需要Point类吗?

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

我的主要疑问是,当我们用方法的属性调用时,为什么它用每个方法调用class.some_method。为什么每个人需要打电话?

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

3 个答案:

答案 0 :(得分:3)

关键是

  

python内部为你转换

从你的角度来看:

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

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

编辑1 如果我正确理解了您的问题,那么当您已经拥有实例时,您会问为什么Python需要知道 ,实例知道自己的类型。事实上,Python基于实例all the time获取方法。我认为教程的​​重点是,在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参数是那些指令字节如何知道要处理的实例,以及该方法如何访问传递的实例中的其他数据。

编辑3 self并不是本地与全局的名称空间。但是,可以公平地说self.foo指的是foo确实可以访问当前类的所有方法。给定

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

Point.distance来电中,self指的是ab,但不是两者。因此,当您致电a.distance()时,self.x将是a.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()时,只有一个getUserMedia()个实例。

答案 1 :(得分:2)

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

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()函数。

答案 2 :(得分:1)

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

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

as

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

因此代码将应用于正确的类实例。