首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python中的类方法差异:绑定,未绑定和静态

类方法通常是在类定义中声明的函数,具有self关键字作为第一个参数,以表示它们实际上属于特定对象而不是类本身。Python的类方法共有三种类型:

  1. 未绑定类方法(unbound method):未绑定类的函数。对于该方法,self是一个实例变量引用,需要将self视为一个普通的实例变量,通常无需显式调用self
代码语言:python
复制
class MyClass:
    def unbound_method(self):
        print("This is an unbound method.")

未绑定方法可以像普通函数一样使用,需要实例化类后调用方法:

代码语言:python
复制
# Create an instance of MyClass
my_instance = MyClass()

# Call the unbound method
unbound_method(my_instance)  # This is an unbound method.
  1. 绑定类方法(bound method):绑定类的函数。绑定方法可以通过引用实例变量 self 将类的方法与该类的一个实例相关联。当使用绑定方法时,需要提供类的实例,即参数,从而将类的方法与实例相关联。
代码语言:python
复制
class MyClass:
    def bound_method(self):
        print("This is a bound method.")

当使用绑定方法时,需要传入类的实例:

代码语言:python
复制
# Create an instance of MyClass
my_instance = MyClass()

# Call the bound method with my_instance as the first argument
bound_method(my_instance)  # This is a bound method.
  1. 静态类方法(static method):静态方法不需要实例。它们属于类本身而不是类实例,与类的任何特定实例都不关联。它们使用@classmethod装饰器进行定义。
代码语言:python
复制
class MyClass:
    @classmethod
    def static_method(cls):
        print("This is a static method.")

静态方法可作为一个独立的函数使用,无需实例即可直接调用:

代码语言:python
复制
# Call the static method without creating an instance of MyClass
MyClass.static_method()  # This is a static method.

总结差异:

  • 未绑定:实例变量引用、普通调用、无传入实例。
  • 绑定:传入类的实例、与普通使用类似。
  • 静态:无需实例、作为独立的函数使用。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java静态绑定动态绑定

当子类存在同一个方法,子类重写了父方法,程序在运行时调用方法是调用父方法还是子类重写方法呢,这应该是我们在初学Java时遇到问题。...这里首先我们将确定这种调用何种方法实现或者变量操作叫做绑定。 在Java存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。...而虚方法(可以被子类重写方法)则会根据运行时对象进行动态绑定静态绑定使用信息来完成,而动态绑定则需要使用对象信息来完成。...下面的代码首先会发生静态绑定,确定调用参数为String对象call方法,然后在运行时进行动态绑定确定执行子类还是父call实现。...所以,有些实际可以静态绑定,考虑到安全一致性,就索性都进行了动态绑定。 得到优化启示? 由于动态绑定需要在运行时确定执行哪个版本方法实现或者变量,比起静态绑定起来要耗时。

1.7K10

Java静态绑定动态绑定

当子类存在同一个方法,子类重写了父 方法,程序在运行时调用方法是调用父方法还是子类重写方法呢,这应该是我们在初学Java时遇到问题。...这里首先我们将确定这种调用何种方法实现或 者变量操作叫做绑定。 在Java存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。...而虚方法(可以被子类重写方法)则会根据运行时对象进行动态绑定静态绑定使用信息来完成,而动态绑定则需要使用对象信息来完成。...下面的代码首先会发生静态绑定,确定调用参数为String对象call方法,然后在运行时进行动态绑定确定执行子类还是父call实现。...所以,有些实际可以静态绑定,考虑到安全一致性,就索性都进行了动态绑定。 得到优化启示? 由于动态绑定需要在运行时确定执行哪个版本方法实现或者变量,比起静态绑定起来要耗时。

2K10

Python绑定方法绑定方法实例解析

这说明,不管是方法,还是函数,默认情况下都是绑定给对象使用绑定给对象使用有一种好处,那就是不用手动将对象传入。对象是自动传到。...综上所述,我们可以得出以下结论:      1.凡是方法函数,都是绑定给对象使用;     2.绑定方法都有自动传值功能。传递进去值,就是对象本身。     ...2.绑定方法    既然方法,默认都是绑定给对象使用,那么,我们要采取一点措施,将绑定方法解除对象绑定关系,进而绑定上。    ...在python,引入了@classmethod方法,将方法绑定身上。...答案:当然有,python给我们提供了@staticmethod,可以解除绑定关系,将一个方法,变为一个普通函数。

95710

Java静态绑定动态绑定

当子类存在同一个方法,子类重写了父 方法,程序在运行时调用方法是调用父方法还是子类重写方法呢,这应该是我们在初学Java时遇到问题。...这里首先我们将确定这种调用何种方法实现或 者变量操作叫做绑定。 在Java存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种就是动态绑定,亦称为后期绑定。...而虚方法(可以被子类重写方法)则会根据运行时对象进行动态绑定静态绑定使用信息来完成,而动态绑定则需要使用对象信息来完成。...下面的代码首先会发生静态绑定,确定调用参数为String对象call方法,然后在运行时进行动态绑定确定执行子类还是父call实现。...所以,有些实际可以静态绑定,考虑到安全一致性,就索性都进行了动态绑定。 得到优化启示? 由于动态绑定需要在运行时确定执行哪个版本方法实现或者变量,比起静态绑定起来要耗时。

1.5K30

Java静态绑定与动态绑定

程序绑定概念 绑定指的是一个方法调用与方法所在(方法主体)关联起来。对java来说,绑定分为静态绑定动态绑定;或者叫做前期绑定后期绑定....也就是说在编译过程中就已经知道这个方法到底是哪个方法; 针对java简单可以理解为程序编译期绑定;这里特别说明一点,java当中方法只有final,static,private构造方法是前期绑定...因此就可以说private方法定义这个方法绑定在了一起。...唯一不同就是,当子类对象上转型为父对象时,不论子类中有没有定义这个静态方法,该对象都会使用父静态方法。因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父成员变量是一样。...隐藏覆盖区别在于,子类对象转换成父对象后,能够访问父被隐藏变量方法,而不能访问父被覆盖方法) 由上面我们可以得出结论,如果一个方法不可被继承或者继承后不可被覆盖,那么这个方法就采用静态绑定

1.5K30

python静态方法方法

设置属性 4.通过查看属性值,来看属性监控是否成功 二、静态方法方法名称前加一个头标记@staticmethod。...静态方法往往用于一些自定义来实现一些通用功能,可以方便我们调用方法静态方法,不需要self这类参数,因为静态方法,不需要进行实例化,就可以进行调用。...三、方法方法名称前加一个头标记@classmethod。 方法调用也不需要进行实例化。 方法是在python构造方法一个补充。...四、静态方法定义调用方式 定义: @staticmethod def 方法名称: 方法主体 举例 @staticmethod def say(): print("我们是静态方法...name="test方法" print(name) 调用: Person.setName() 静态方法方法区别主要是在方法定义时候头标记不同。

3.1K20

python静态方法方法

静态方法方法python2.2被引用,经典新式都可以使用。同时,一对内建函数:staticmethodclassmethod被引入,用来转化某一方法为这两种方法之一。...静态方法静态方法函数,不需要实例。静态方法主要是用来存放逻辑性代码,主要是一些逻辑属于,但是本身没有交互,即在静态方法,不会涉及到方法属性操作。...可以理解为将静态方法存在此类名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。 例子: 譬如,我想定义一个关于时间操作,其中有一个获得当前时间函数。...函数可以通过名以及实例两种方法调用! 注意: python2 ,必须总要把一个方法声明为静态,从而能够不带一个实例而调用它。...python3 ,如果方法只通过调用,而不需要通过实例调用的话,不用非要声明为静态。 #!

1.4K30

与对象绑定方法

与对象绑定方法 class OldboyStudent: school = 'oldboy' def __init__(self, name, age, gender):...self): print(f'{self.name} choosing course') def func(self): print('from func') 名称空间中定义数据属性函数属性都是共享给所有对象用...('tank', 19, 'female') print(stu1.name) print(stu1.school) nick oldboy 定义函数是函数属性,可以使用,但使用就是一个普通函数而已...定义函数是共享给所有对象,对象也可以使用,而且是绑定给对象用绑定效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入 ?...,确实可以使用,但其实定义函数大多情况下都是绑定给对象用,所以在定义函数都应该自带一个参数self stu1.func() from func stu2.func() from func

74130

Java静态绑定与动态绑定区别,讲明白了

Java静态绑定静态绑定绑定可以在运行时或编译时解析。所有static,finalprivate方法绑定过程都在编译时完成。 ?...Java动态绑定 在Java重写可以被认为是动态绑定最佳示例,因为父子类具有相同方法 - 也就是说,它不决定要调用方法。 什么是Java静态绑定?...static,finalprivate方法绑定始终是静态绑定,因为静态绑定提供了更好性能,并且它们无法被覆盖,因此将始终由某个本地对象访问。...以超打印。 在上面的示例,两种情况都给出了相同结果: 子类引用是相同,即单个对象。 因为它不能在子类重写,即超编译器,所以它知道并且没有歧义。 什么是Java动态绑定?...Java静态绑定使用官方类型数据,而Java限制动态绑定使用对象来确定绑定。 使用静态绑定来解决重载方法,同时使用动态绑定(即在运行时)重写方法

1.9K10

PHP静态延迟绑定普通静态效率对比

PHP静态延迟绑定普通静态效率对比 只是一个简单小实验,对比了下 延迟绑定 非延迟效率 延迟绑定主要就是使用 static 关键字来替代原来 self ,但功能非常强大了 实验代码: class...里面全是静态成员变量方法,其中 A 是使用了静态延迟, B 是非延迟, C 是继承A实现了静态成员变量方法延迟绑定。...过程也不多说了,环境是 PHP5.4.27 直接上测试结果: 有两种情况, 当只有 A、B(也就是不让任何继承A)时,效率上几乎没有差别的 当A被C继承了之后,使用静态延迟绑定A性能将会比...B稍差一些(只要A有了继承就会变慢) 循环十万次,耗时在 2.8s ~ 3.2s 之间 时间差距在 0.3 秒左右,应该还是可以忽略不计了吧 补充个:后来加了些测试方法,如果 C 继承 A...后,重载了部分 A 静态成员变量,重载越多则速度 B (非延迟)就越接近,但 A 速度仍然会比 B C

61430

后期静态绑定在PHP使用

后期静态绑定在PHP使用 什么叫后期静态绑定呢?其实我们在之前文章PHPstatic已经说过这个东西了。今天我们还是再次深入理解一下这个概念。...别激动,这是普通静态绑定。self关键字调用内容取决于它定义时所在。也就是说不管怎么继承,用哪个子类来调用test()方法,self关键字都会调用是Awho()方法。 而后期静态绑定呢?...官方文档定义如下: 当进行静态方法调用时,该类名即为明确指定那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属。 该功能从语言内部角度考虑被命名为“后期静态绑定”。...“后期绑定意思是说,static:: 不再被解析为定义当前方法所在,而是在实际运行时计算。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法调用。...在静态方法可以根据调用方式判断当前是哪个来进行其他业务逻辑操作。另一个是forward_static_call()方法,用于静态方法调用。

68910

浅谈JAVA静态绑定动态绑定(源自《深入理解Java虚拟机》)

参考链接: Java静态绑定与动态绑定 静态绑定:又称“前期绑定”,发生在编译期; 主要是方法重载(overload); 在编译阶段,javac编译器会根据参数静态类型决定使用哪个重载版本。 ...动态绑定:又称“后期绑定”,发生在运行期; 主要是方法重写(override); 在运行阶段,Java虚拟机根据参数实际类型决定调用哪个重写版本,查找顺序是从子类->父,直到找到该方法声明为止;...如果在层次结构任何中都找不到该方法,则虚拟机抛出错误信息。 ...解释:上面代码”Human”称为变量静态类型,“Man”“Woman”称为变量实际类型。...解释:上面的代码调用sayHello()方法时根据new创建实际对象确定调用该对象内方法。  补充:Java语言中方法重写本质:在运行期确定对象实际类型。

55520

Python动态绑定实现原理

使用实例引用属性时,会发生动态绑定。即python会在实例每次引用类属性时,将对应类属性绑定到实例上。...,方法变化是实时影响实例对方法调用,这说明python是在实例调用方法过程动态地查找方法。...输出数据,第一行为动态绑定一次绑定耗费时间差值,第二行为差值占动态绑定总时间比例。 可以看出,在次数很小时候,两者基本没有差距,或者说差距忽略不计。...在10^7次循环,即千万次循环时候,动态绑定静态绑定耗费时间才出现了明显差异,当循环次数达到十亿级时候,耗费时间相差15秒之多,约占总时间15%。...s.test_hello() if __name__ == "__main__": main() 输出结果: hello2 world 方法变动能够实时反应在动态绑定上,而提前绑定则无法感知到方法变动

50621

Python静态方法方法及实例方法

概述 在Python,有着类属性、实例属性,静态方法方法、实例方法区别。到底有什么不一样呢?接下来我们就一探究竟。...、静态方法方法 方法包括:实例方法静态方法方法,三种方法在内存中都归属于,区别在于调用方式不同。...对象不能直接调用实例方法静态方法可以。 self与cls区别 self 指的是实例对象本身(注意:不是本身)。...其中 self, cls 只是代指实例对象对象,因此换成其他变量也可以,但是约定成俗(为了其他编程语言统一,减少理解难度),不要搞另类,大家会不明白。...使用场景 需要操作类属性定义成方法。 需要操作实例属性定义成实例方法。 既不需要操作类属性,也不需要操作实例属性就定义成静态方法

2.9K10

Python静态方法方法及实例方法

概述 在Python,有着类属性、实例属性,静态方法方法、实例方法区别。到底有什么不一样呢?接下来我们就一探究竟。...、静态方法方法 方法包括:实例方法静态方法方法,三种方法在内存中都归属于,区别在于调用方式不同。...对象不能直接调用实例方法静态方法可以。 self与cls区别 self 指的是实例对象本身(注意:不是本身)。...其中 self, cls 只是代指实例对象对象,因此换成其他变量也可以,但是约定成俗(为了其他编程语言统一,减少理解难度),不要搞另类,大家会不明白。...使用场景 需要操作类属性定义成方法。 需要操作实例属性定义成实例方法。 既不需要操作类属性,也不需要操作实例属性就定义成静态方法

2.9K00

【说站】java静态动态绑定对比

java静态动态绑定对比 不同绑定比较 1、静态绑定发生在编译期,动态绑定发生在运行期。...2、动态绑定灵活性高于静态绑定,因为静态绑定是在编译过程确定,动态绑定在编译过程不知道调用哪种方法。 3、静态绑定调用方法比动态绑定快,因为静态绑定可以直接调用,动态绑定需要搜索方法表。...实例 静态绑定 class Super{ public static void sample(){ System.out.println("This is the method of super class... the method of sub class");   }   Public static void main(String args[]){ Sub.sample()   }   } (2)动态绑定...method of sub class");   }   Public static void main(String args[]){ new Sub().sample()   }   } 以上就是java静态动态绑定对比

44620

Python实例方法方法方法静态方法浅析

一、前言 方法也可以进行更细致划分,具体可分为方法、实例方法静态方法。 二、案例详解 实例方法 通常情况下,在定义方法默认都是实例方法。...方法 Python 方法实例方法相似,它最少也要包含一个参数,只不过方法通常将其命名为 cls,Python 会自动将本身绑定给 cls 参数(注意,绑定不是对象)。...静态方法 静态方法定义在这个空间(命名空间),而函数则定义在程序所在空间(全局命名空间)。...静态方法没有类似 self、cls 这样特殊参数,因此 Python 解释器不会对它包含参数做任何或对象绑定静态方法需要使用@staticmethod修饰。...三、总结 本文基于Python基础,介绍了实例方法方法方法静态方法,通过实际案例讲解了三种方法不同用法,通过代码演示,运行效果图展示,能够帮助读者更好理解。

2.4K30
领券