我正在学习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。为什么它的需求与每个人都呼唤?
#如果我理解正确,那么它是必要的,因为这样每个方法都可以访问其他方法的数据,例如变量和填充物?
关键是
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
是指a
或b
,但不是两者都指。所以当你打电话时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()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句