首页
学习
活动
专区
圈层
工具
发布

Python入门之@classmethod与@staticmethod

为对象量身定制 对象.boud_method(),自动将对象当作第一个参数传入 (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说...) 非绑定方法:用staticmethod装饰器装饰的方法    不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。...就是一个普通工具而已     注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法...,对于未绑定方法,调用 A.m1 时必须显示地传入一个实例对象进去,而 a.m1是已经绑定了实例的方法,python隐式地把对象传递给了self参数,所以不再手动传递参数,这是调用实例方法的过程。...A.m1(a, 1) == a.m1(1) #上面的等式左右两边的意义是相同的 如果未绑定的方法 A.m1 不传实例对象给 self 时,就会报参数缺失错误,在 py3 与 py2 中,两者报的错误不一致

2.1K60

《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器 (上)

为了达到预期的效果,SongBird的构造方法必须调用其超类Bird的构造方法来确保进行基本的初始化。有两种方法能达到这个目的:调用超类构造方法的未绑定版本,或者使用super函数。...调用未绑定的超类构造方法 >>> class SongBird(Bird): ... def __init__(self): ... Bird....Squawk 在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(这称为绑定方法)。...但如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定。这样就可以自由地提供需要的self参数。...这样的方法称为未绑定(unbound)方法 使用super函数 当前的类和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。

72230
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    每天一道 python 面试题 - Python反射与自省

    ,self代表实例对象本身,调用方法时,解释器传给方法 print('create a object') def in_class(self): #方法,必须绑定到实例才能调用...class my_sub_class.version #子类数据属性 '2.0' dir()方法,没有参数,返回当前本地作用域中的名称列表。...__class__ 类属性和实例属性:类属性仅是与类相关的数据值,这些值可以像静态成员那样被引用,即使在多次实例化中调用类,他们的值都保持不变 class T(object): version...方法仅仅是类内部定义的函数,这意味着方法时类属性而不是实例属性 任何方法定义的第一个参数都是变量self,它表示调用此方法的实例对象 非绑定方法:需要调用一个还没有任何实例的类中的一个方法 class...')) #未绑定的方法必须使用一个Person实例作为第一个参数来调用 'The name is zhang' p = Person('python') #实例化绑定方法,使用实例调用,调用的实例被作为第一个参数被隐含的传递过去

    98810

    python中子类调用父类的初始化方法

    : B instance has no attribute 'namea' 在子类中,构造函数被重写,但新的构造方法没有任何关于初始化父类的namea属性的代码,为了达到预期的效果,子类的构造方法必须调用其父类的构造方法来进行基本的初始化...有两种方法能达到这个目的:调用超类构造方法的未绑定版本,或者使用super函数。...方法一:调用未绑定的超类构造方法 修改代码,多增一行: 12345678910111213141516171819202122 class A:    def __init__(self):        ...这种方法叫做调用父类的未绑定的构造方法。在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(称为绑定方法)。但如果直接调用类 的方法(比如A.__init),那么就没有实例会被绑定。...这样就可以自由的提供需要的self参数,这种方法称为未绑定unbound方法。 通过将当前的实例作为self参数提供给未绑定方法,B类就能使用其父类构造方法的所有实现,从而namea变量被设置。

    3K10

    Python类的继承和方法重写总结

    为了达到预期的效果,SongBird的构造方法必须调用父类的构造方法来确保进行基本的初始化。有两种方法能达到这个目的:调用超类的构造方法的未绑定版本,或者使用super函数。...调用超类的构造方法的未绑定版本 >>> class SongBird(Bird): ...     def __init__(self): ...         Bird....__init__(self) 看下执行结果 >>> sb = SongBird() >>> sb.eat() Aaaah... >>> 在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(...__init__),就没有实例被绑定,这样的方法称为未绑定方法。 通过将当前的实例作为self参数提供给未绑定方法,SongBird类就能使用其超类构造方法的所有实现。...当前类和对象可以作为super函数的参数使用,调用函数返回的对象的任何方法都是调用超类的方法,而不是当前类的方法。

    3.4K10

    Python面向对象总结及类与正则表达式

    其次,方法只有在其所属的类拥有实例时,才能被调用。当一个类存在实例后,方法才被认为是绑定到这个实例。没有实例的时候,方法是未绑定的。   ...最后,任何一个方法定义的第一个参数都是变量 self ,它表示调用此方法的实例对象。   很明显这里的绑定针对的是实例方法。...因为如果没有实例的话,self 就无法传递,这将导致参数的不足,当然就无法调用了。 但是,我们可以自己传递 self 来调用未绑定的方法。...调用未绑定的方法通常是在我们继承了一个父类后, 我们覆盖了父类中的某个方法,但是为了实现代码重用,我们又想在子类中调用父类的方法。...本来我们没有创建父类的示例,是无法调用父类的实例方法的,但是我们手动传递了实例方法需要的 self 参数,就可以实现调用了。

    63430

    Python编程思想(25):方法深度解析

    当程序在类体中定义变量、定义方法时,与前面介绍的定义变量、定义函数其实并没有太大的不同。对比如下代码。...现在问题来了,如果使用类调用实例方法,那么该方法的第一个参数(self)怎么自动绑定呢?...# 显式地为方法的第一个参数绑定Python字符串参数值 Person.run('Python') 如果按上面方式进行绑定,那么Python字符串就会被传给run()方法的第1个参数self。...Python的类可以调用实例方法,但使用类调用实例方法时,Python不会自动为方法的第1个参数self绑定参数值。程序必须显式地为第1个参数self传入方法调用者。...这种调用方式被称为“未绑定调用”。 2. 类方法与静态方法 实际上, Python完全支持定义类方法,甚至支持定义静态方法。

    76930

    Python快速学习第七天

    9.2.2 调用未绑定的超类构造方法 本节所介绍的内容只要是历史遗留问题。在目前版本的Python中,使用super函数(下一节会介绍)会更为简单明了(在Python3.0中更是如此)。...为什么会有这样的结果?在调用一个实例的方法时,该方法的self参数会被自动绑定到实例上(这称为绑定方法)。前面已经给出几个类似的例子了。但是如果直接调用类的方法(比如Bird....__init__),那么就没有实例会被绑定。这样就可以自由地提供需要的self参数。这样的方法称为未绑定(unbound)方法,也就是这节标题中所提到的。...通过将当前的实例作为self参数提供给未绑定方法,SongBird就能够使用其超类构造方法的所有实现,也就是说属性hungry能被设置。...☑ 重写:一个类能通过实现方法来重写它的超类中定义的这些方法和属性。如果新方法要调用重写版本的方法,可以从超类(旧式类)直接调用未绑定的版本或使用super函数(新式类)。

    2.8K50

    python 封装、绑定

    目录 python 封装、绑定 1、数据、方法的封装 2、隐藏属性 3、开放接口 4、绑定方法 1、对象的绑定 2、类的绑定(classmethod) 3、非绑定方法(staticmethod) 5、property...数据和方法的私有格式一样,知道底层的格式也是可以调用/获取到方法内和数据的信息,互联网没有绝对的安全 3、开放接口 类的私有原则是对外私有,但是在类内可以修改和继续使用,定义属性就是为了使用 计算器有很多种功能...,对象来调用,会把自己当成第一个参数传到函数里面self''' def get_info(self): print(f'姓名:{self.name}|年龄:{self.age}...__dict__) # {} 2、property装饰器 property装饰器可以将类中的函数‘伪装成’对象的数据属性,对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次的访问结果...被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名。 被 @属性名.setter 装饰的方法是设置属性值的方法。

    79320

    python调用父类方法的三种方式(super调用和父类名调用)

    未绑定方式使用super()函数,但如果涉及多继承,该函数只能调用第一个直接父类的构造方法。...也就是说,涉及到多继承时,在子类构造函数中,调用第一个父类构造方法的方式有以上两种,而调用其他父类构造方法的方式只能使用未绑定方法。...__init__(self, name)使用未绑定方法调用第一个父类的构造方法 #调用其他父类的构造方法,需要手动给self传值 Animal....我是动物,我吃 熟食可以看到,Person类自定义的构造方法中,调用People类构造方法,可以使用super()函数,也可以使用未绑定方法。...但是调用Animal类的构造方法,只能使用未绑定方法

    2.5K20

    类和对象

    python 的 self 就是相同的道理,由同一个类可以生成无数个对象。这些对象都长得很相似,都来源于同一个类的属性和方法。 当对象的方法被调用的时候,对象会将自身作为一个参数传给 self 参数。...接受到 self 的时候,python 就知道是哪个对象在调用方法了。 绑定方法,可以认为方法中的 self 其实就是实例对象的唯一标志。 (2) 类的定义的时候,把 self 写进第一个参数。...实例化对象的时候是可以传入参数的,这些参数会自动传入 __init__(self) 方法中,通过重写这个方法来自定义对象的初始化操作。 ? ? 3,公有和私有 (1) ?...2,如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。 ? ? 3,解决的方式是重写方法的时候,先调用子类的方法。调用未绑定的父类函数: ? ? ?...属性名用名词,方法名用动词。 6,什么是绑定? python 严格要求方法需要有实例才能被调用,这种限制其实就是 python 所谓的绑定概念。 错误写法: ?

    1.2K20

    关于如何在Python中使用静态、类或抽

    (get_size),因为它没有绑定到Pizza的任何实例上,而且一个方法需要一个实例作为它的第一个参数(Python2中必须是类的实例,Python3没有这个强制要求),让我们试一下: >>>...Pizza.get_size(Pizza(42)) 42 我们使用一个实例作为这个方法的第一个参数来调用它,没有出现任何问题。...我们每次调用方法都要涉及(这里我理解是引用)类 来看Python打算为我们做些什么,就是它从Pizza类中绑定所有的方法到这个类的任何实例上。...__self__.get_size True 明显可以看出,我们仍然保持对我们对象的引用,而且如果需要我们可以找到它 在Python3中,类中的函数不再被认为是未绑定的方法(应该是作为函数存在...,它都会被绑定到类中,它的第一个参数必须是类本身(记住类也是对象) 什么时候使用类方法,类方法在以下两种场合会有很好的效果:     1、工厂方法,为类创建实例,例如某种程度的预处理。

    1K30

    js重修课:函数

    方法调用即对一个对象内的函数的调用,如a.sort();。在放大调用中,this指针引用调用该方法的对象。之前一直没有注意的一点是:this和变量不同,它不像变量有作用域的限制。...只要函数作为普通函数调用,不论嵌套在哪,this的值不是全局对象就是undefined;而只要函数作为方法调用,this的值就是调用它的对象。...一般在嵌套函数中利用变量的作用域来保存this的值,如下: var o = { m: function() { var self = this; function...bind()方法是ECMAScript 5新增的方法,可以更便捷地绑定调用函数上下文。使用方法如f.bind(o);,即用o调用f()。...而若定义了嵌套函数,并将其作为返回值存于某个属性中,保持了引用,这个嵌套函数所绑定的变量就不会被当作垃圾回收。

    84720

    课时38:类与对象:继承

    目录:   一、继承   二、调用未绑定的父类方法   三、使用super函数   四、多重继承   五、课时38课后习题及答案 现在需要扩展游戏,对鱼类进行细分,有金鱼(Goldfish)、三文鱼(Salmon...原因其实是这样的:在Shark类中,重写了魔法方法_ _init_ _,但新的_ _int_ _方法里边没有初始化鲨鱼的x坐标和y坐标,因此调用move方法就会出错。...那么解决这个问题的方案就很明显了,应该在鲨鱼类中重写_ _int_ _方法的时候先调用基类Fish的_ _init_ _方法。...下面介绍两种可以实现的技术: (1)调用未绑定的父类方法 (2)使用super函数 ******************************* 二、调用未绑定的父类方法 **************...Fish的实例对象,而是子类Shark的实例对象,所以这里说的未绑定是指并不需要绑定父类的实例对象,使用子类的实例对象代替即可。

    54550

    第27天面向对象之反射,绑定方法,特定的

    绑定方法与非绑定方法 绑定方法(其实并没有这样的说法,只是为了解释三个装饰器而说出来的比较容易记名词)   绑定方法的核心就是,谁绑定的就应该给谁来调用,谁来调用我们就会将谁作为第一个参数传递进去。   ...绑定对象方法:应该被对象来调用,python会自动的将对象当做第一个参数传递进来,__init__方法就是这个道理   绑定类的方法:应该被类来调用,python会自动的将类当做第一个参数传递进来。...如何用绑定方法和非绑定方法 1. 对象绑定方法特点 1. 对象去调用的时候,自动传值 2. 类去调用的时候,就是一个普通的函数,需要自己去传值 ? ?...类绑定方法的特点 无论是对象还是累调用的时候都是自动的把类当做第一个参数传递进去 ? ?...非绑定方法的特点 无论是类还是对象去调用的时候都是作为普通函数,不会进行自动的传值 ? ?

    71930

    Python面向对象:杂七杂八的知识点

    当通过实例对象去调用方法时,或者说会自动传递self的方法是绑定方法,其它通过类名调用、手动传递self的方法调用是非绑定方法,在3.x中没有非绑定方法的概念,它直接被当作是普通函数。...此外,类中的方法并非一定要求有self参数。 静态方法和类方法 python的面向对象中有3种类型的方法:普通的实例方法、类方法、静态方法。...,和下面的类方法调用注意区分比较。 调用类方法。因为@classmethod已经将m2包装成了类方法,所以m2的第一个self参数将总是代表类名,而无论是使用对象去调用m2还是使用类名去调用m2。...方法的默认可变参数陷阱 如果一个方法的参数给了默认参数,且这个默认参数是一个可变类型,那么这里有一个陷阱:使用这个默认参数的时候各对象会共享这个可变默认值。...self.data.append(value) # 两个不同对象,且都使用参数arg的默认值 a1 = A() a2 = A() # 向两个对象中添加元素 a1.add("a1") a2.add("

    1.1K21

    3.Python3扩展知识之笔试操作总结(三)

    它总会被绑定在其归属的类上,同时它第一个参数是类本身(记住:类同样是对象) 抽象方法在一个基类中定义,但是可能不会有任何的实现。在 Java 中,这被描述为一个接口的方法。 #!...) #Python3中 归属于一个类的函数不再被看成未绑定方法(unbound method),但是作为一个简单的函数(返回函数地址) #Python2中...,模型被简化了 print("get_size() 获取方法后值:",Pizza(12).get_size()) #实例化对象调用get-size方法 ## 但是如何知道已绑定的方法被绑定在哪个对象上...mix_ingredients 作为一个非静态的方法也可以 work,但是给它一个 self 的参数将没有任何作用。...例子中如果一个属性或方法在 D 类中没有被找到,Python 就会搜寻 B 类,然后搜索 C类,如果都没有找到,会继续搜索 B 的基类 A,如果还是没有找到,则抛出“AttributeError”异常。

    75030

    9个Python 内置装饰器: 显著优化代码

    这个装饰器可以用来缓存一个函数的结果,这样后续调用相同参数的函数就不会再执行了。它对于计算量大或使用相同参数频繁调用的函数特别有用。...@propertyGetter 和 setter 是面向对象编程 (OOP) 中的重要概念。对于类的每个实例变量,getter 方法返回它的值,而 setter 方法设置或更新它的值。...所以没有对同一个不变实例的circle.area进行重复计算。6. @classmethod在 Python 类中,有 3 种可能的方法类型:实例方法:绑定到实例的方法。他们可以访问和修改实例数据。...在类的实例上调用实例方法,它可以通过 self 参数访问实例数据。类方法:绑定到类的方法。他们不能修改实例数据。在类本身上调用类方法,它接收类作为第一个参数,通常命名为 cls。...静态方法:未绑定到实例或类的方法。实例方法可以定义为普通的 Python 函数,只要它的第一个参数是 self。但是,要定义一个类方法,我们需要使用@classmethod 装饰器。

    1.4K30

    Python专家编程系列: 4. 善用类装饰器(Python Class Decorators)

    它可以将一个类的方法转换为一个属性,该属性的值计算一次,然后在实例的生命周期内作为普通属性缓存。...所以没有对同一个不变实例的circle.area进行重复计算。 2.3 classmethod 在 Python 类中,有 3 种可能的方法类型: 实例方法:绑定到实例的方法。...在类的实例上调用实例方法,它可以通过 self 参数访问实例数据。 类方法:绑定到类的方法。他们不能修改实例数据。在类本身上调用类方法,它接收类作为第一个参数,通常命名为 cls。...静态方法:未绑定到实例或类的方法。 实例方法可以定义为普通的 Python 函数,只要它的第一个参数是 self。...2.4 staticmethod 如前所述,静态方法不绑定到实例或类。它们被包含在一个类中只是因为它们在逻辑上属于那个类。 静态方法通常用于执行一组相关任务(例如数学计算)的实用程序类。

    47630
    领券