python tips:类的绑定方法(bound)和非绑定方法(unbound)

类属性只有类及其实例能够访问,可以理解为一个独立的命名空间。

Python中类属性的引用方式有两种:

1. 通过类的实例进行属性引用,称为绑定方法(bound method),可以理解为方法与实例绑定在一起。

2. 通过类进行属性引用,称为非绑定方法(unbound method),方法没有与实例绑定。

在绑定方法中,为了与实例绑定,Python自动将实例作为方法的第一个参数,而非绑定方法则表现的像普通函数,和普通函数的区别在于它只能通过类来访问。

两种引用方式:

 1 class A:
 2     def test1(self):
 3         print(self)
 4
 5 def main():
 6     a = A()
 7     a.test1()
 8     A.test1(a)
 9     A.test1(2)
10
11 if __name__ == "__main__":
12     main()

输出结果:

1 <__main__.A object at 0x00000212C48D5908>
2 <__main__.A object at 0x00000212C48D5908>
3 2

上述代码中,类A有一个test1方法。两种引用方式说明如下:

1. 通过实例a来引用方法时,python自动将a作为第一个参数(self)传给方法test1。

2. 通过类来直接引用时,需要显式传给test1一个self参数,但是这个参数并不要求一定要是类的实例,传入其他值亦可(上述代码中传入的是2)。

引用方式的问题与优点:

 1 class A:
 2     def test2():
 3         print("hello")
 4
 5     def test3(solf):
 6         print(solf)
 7
 8 class B:
 9     pass
10
11 def main():
12     a = A()
13     try:
14         a.test2()
15     except Exception as e:
16         print(e)
17     b = B()
18     A.test3(b)
19
20 if __name__ == "__main__":
21     main()

输出结果:

1 test2() takes 0 positional arguments but 1 was given
2 <__main__.B object at 0x000001DFE1AC7898>

由于实例引用会隐式传入实例作为方法的第一个参数,所以当类的方法不接受参数的时候,使用实例就无法调用该方法。

类引用的显式传参没有要求,所以可以将A类的方法作用于B上。

类方法(classmethod)和静态方法(staticmethod):

 1 class A:
 2     @classmethod
 3     def test4(self):
 4         print(f"classmethod: {self}")
 5
 6     @staticmethod
 7     def test5(self):
 8         print(f"staticmethod: {self}")
 9
10 def main():
11     a = A()
12     a.test4()
13     A.test4()
14     a.test5(2)
15     A.test5(2)
16
17
18 if __name__ == "__main__":
19     main()

输出结果:

classmethod: <class ‘__main__.A‘>
classmethod: <class ‘__main__.A‘>
staticmethod: 2
staticmethod: 2

类方法和静态方法使用装饰器实现,和普通的方法有所区别。

从作用上看:

1. 类方法是只与类相关,而与类的实例无关的方法。

2. 静态方法是与类和实例都无关的方法。

从实现上看:

1. 类方法和静态方法统一了实例引用和类引用,两者都能通过两种引用方式调用。

2. 类方法永远隐式地使第一个传入的参数为类,静态方法所有参数都需要显示传入。

总结:

1. 类属性引用有两种,分为实例引用和类引用,对于方法属性,前者隐式传入实例作为第一个参数,后者类似于普通函数

2. self和cls是约定的实例和类的名称表示,并无强制性含义,类引用时可以传入任意值而不一定是类实例

3. 类方法与静态方法统一了两种引用方式,前者永远隐式传入类作为第一个参数,后者所有参数都需要显示传入。

原文地址:https://www.cnblogs.com/luoheng23/p/10989572.html

时间: 2024-10-06 22:12:57

python tips:类的绑定方法(bound)和非绑定方法(unbound)的相关文章

python tips:类与实例的属性问题

实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性. 实例1: 1 class A: 2 work = list("hello") 3 kind = list("world") 4 another = 1 5 6 def test1(self): 7 print(self.work, self.kind, self.another) 8 self.work[0], self.kind [0] = &

java 多线程阻塞队列 与 阻塞方法与和非阻塞方法

Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的.在FIFO队列中,所有新元素都插入队列的末尾.队列都是线程安全的,内部已经实现安全措施,不用我们担心 Queue中的方法 Queue中的方法不难理解,6个,每2对是一个也就是总共3对.看一下JDK API就知道了: 注意一点就好,Queue通常不允许插入Null,尽管某些实现(比如Link

python tips:类的动态绑定

使用实例引用类的属性时,会发生动态绑定.即python会在实例每次引用类属性时,将对应的类属性绑定到实例上. 动态绑定的例子: 1 class A: 2 def test1(self): 3 print("hello") 4 5 def test2(self): 6 print("world") 7 8 def bound(): 9 a = A() 10 a.test1() 11 A.test1 = A.test2 12 a.test1() 13 14 if __n

3.1.9 类内部定义的函数:绑定方法与非绑定方法

'''在类内部定义的函数,分为两大类: 一:绑定方法:绑定给谁,就应该由谁来调用,谁来调用就会把调用者当作第一个参数自动传入 1. 绑定到对象的方法:在类内定义的没有被任何装饰器修饰的 2. 绑定到类的方法:在类内定义的被装饰器@classmethod修饰的方法 二:非绑定方法:没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用 非绑定方法:不与类或者对象绑定,在类内定义的被装饰器@staticmethod修饰的方法 说明:未做任何修饰时:在类内定义的方法是绑定给对象的,对象调

Python中的绑定方法和非绑定方法

绑定方法 类中定义的方法大致可以分为两类:绑定方法和非绑定方法.其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法~ 绑定到对象的方法 在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制. class Person: country = "China" def __init__(self, name, age): self.name = name self.age = age def speak(self): print(self.name + ', '

093 类和对象的绑定方法和非绑定方法

目录 一.绑定方法 1.1 对象的绑定方法 1.2 类的绑定方法 1.3 类的绑定方法用在什么地方? 二.非绑定方法(静态方法) 2.1 非绑定方法用在什么地方? 类中定义的方法大致可以分为两类:绑定方法和非绑定方法.其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法. 一.绑定方法 对象的绑定方法/类的绑定方法 1.1 对象的绑定方法 在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制. 通常说的绑定方法都是对象的绑定方法,因为类创建时默认就是对象的绑定方法.

009---绑定方法与非绑定方法

绑定方法和非绑定方法 绑定方法(绑定给谁,谁来调用就自动将它本身作为第一个参数传进去) 绑定给类:没有加任何装饰器的方法,其实对象也可以调用.只不过内部将类作为第一个参数传进去. 绑定给对象:加classmethod装饰器的方法,其实类也可以调用,只不过要将对象作为第一个参数传进去. 非绑定方法 在类的内部使用staticmethod装饰器的函数叫做非绑定方法,谁都可以调用,没有自动传值一说,就是普通函数. #! /usr/bin/env python # -*- coding: utf-8 -

【2020Python修炼记】面向对象编程——绑定方法与非绑定方法

[目录] 一.绑定方法与非绑定方法 二.非绑定方法 一.绑定方法与非绑定方法 ? 类中定义的函数分为两大类:绑定方法和非绑定方法 ? 其中绑定方法又分为绑定到对象的对象方法和绑定到类的类方法. ? 在类中正常定义的函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到类了. 类方法通常用来在__init__的基础上提供额外的初始化实例的方式: # 配置文件settings.py的内容 HOST='127.0.0.1' PORT=3306 # 类方法的应用 imp

10 绑定方法与非绑定方法

类中定义的函数分为两大类 1.绑定方法 1.1.绑定到类的方法:用classmethod装饰器的方法 为类量身定制 类.bound_method(),自动将类当作第一个参数传入 (其实对象也可调用,但任然将类当作第一个参数传入) class Foo: def __init__(self,name): self.name = name def tell(self): print(f"名字{self.name}") @classmethod # 把类本身当作第一个参数 def func(c