Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中调用对象时,类的引用和它的对象/实例之间的功能区别是什么?_Python_Oop - Fatal编程技术网

在python中调用对象时,类的引用和它的对象/实例之间的功能区别是什么?

在python中调用对象时,类的引用和它的对象/实例之间的功能区别是什么?,python,oop,Python,Oop,我在搜索默认参数对象的含义,即作为默认类和函数参数存在的self,因此,如果我们调用一个类的属性,那么我们应该使用Foo类引用还是应该使用该类的Foo实例。如果您正在读取一个普通属性,那么这无关紧要。如果要绑定普通属性,则必须使用正确的属性才能使代码正常工作。如果要访问描述符,则必须使用实例。python类语义的详细信息在。尤其是uuu get uuu_uuu语义在这里起作用。实例基本上将其名称空间堆叠在类名称空间的顶部,并添加一些用于调用方法的样板文件 这里有一些很大的问题,这取决于你在做什么

我在搜索默认参数对象的含义,即作为默认类和函数参数存在的self,因此,如果我们调用一个类的属性,那么我们应该使用Foo类引用还是应该使用该类的Foo实例。

如果您正在读取一个普通属性,那么这无关紧要。如果要绑定普通属性,则必须使用正确的属性才能使代码正常工作。如果要访问描述符,则必须使用实例。

python类语义的详细信息在。尤其是uuu get uuu_uuu语义在这里起作用。实例基本上将其名称空间堆叠在类名称空间的顶部,并添加一些用于调用方法的样板文件

这里有一些很大的问题,这取决于你在做什么。最重要的问题是:是否要访问类或实例属性?第二,您想要属性还是方法

让我们举一个例子:

class Foo(object):
  bar = 1
  baz = 2
  def __init__(self, foobar="barfoo", baz=3):
    self.foobar = foobar
    self.baz = baz

  def meth(self, param):
    print self, param

  @classmethod
  def clsmeth(cls, param):
    print cls, param

  @staticmethod
  def stcmeth(param):
    print param
在这里,bar是一个class属性,所以您可以通过Foo.bar获得它。由于实例具有对其类名称空间的隐式访问,因此也可以将其作为Foo.bar获取。foobar是一个实例属性,因为它从不绑定到仅类实例,即selfs-您只能以Foo.foobar的形式获取它。最后,baz既是一个类,也是一个实例属性。默认情况下,Foo.baz==2和Foo.baz==3,因为class属性被uuu init_uuu中设置的实例属性隐藏

类似地,在赋值中,无论是在类上还是在实例上,都会有细微的差别。Foo.bar=2还将为所有实例设置class属性,而Foo.bar=2将创建一个实例属性,该属性将为该特定实例的class属性添加阴影

对于方法,它有点类似。然而,在这里,您得到了实例方法的隐式自参数,如果为类定义了函数,那么它是什么。基本上,调用Foo.methparam=x被静默地转换为Foo.methself=Foo,param=x。这就是为什么调用Foo.methparam=x通常是无效的-meth没有绑定到实例,因此缺少self参数


现在,有时您不需要方法中的任何实例数据——例如,您有严格的字符串转换,这是一个更大的解析器类的实现细节。这就是@classmethod和@staticmethod发挥作用的地方。classmethod的第一个参数始终是类,而不是常规方法的实例。Foo.clsmethparam=x和Foo.clsmethparam=x导致调用clsmethodcls=Foo,param=x。在这里,两者是等价的。更进一步说,staticmethod不会获取任何类或实例信息-它就像绑定到类命名空间的原始函数。

如果foo=foo,那么foo.barx==foo.barfoo,xB但为什么如果'foo=foo',那么foo.barx是一个错误。因为bar是一个未绑定的方法。这就是python中类的工作方式——方法被绑定,然后在实例上调用时隐式接收实例作为第一个参数。将属性设置为“static”会绕过实例的使用。另外,通过接收实例,您是否意味着代码“Foo.bar”将返回一个作为其第一个参数的方法对象?通过普通属性,您是指非静态的属性?将值绑定到属性有什么区别?引用和实例在生成和操作上有什么不同?我指的是不是描述符的属性。