python tips:类的绑定方法(bound)和非绑定方法(unbound)
类属性只有类及其实例能够访问,可以理解为一个独立的命名空间。
Python中类属性的引用方式有两种:
1. 通过类的实例进行属性引用,称为绑定方法(bound method),可以理解为方法与实例绑定在一起。
2. 通过类进行属性引用,称为非绑定方法(unbound method),方法没有与实例绑定。
在绑定方法中,为了与实例绑定,Python自动将实例作为方法的第一个参数,而非绑定方法则表现的像普通函数,和普通函数的区别在于它只能通过类来访问。
两种引用方式:
class A:
def test1(self):
print(self) def main():
a = A()
a.test1()
A.test1(a)
A.test1(2) if __name__ == "__main__":
main()
输出结果:
<__main__.A object at 0x00000212C48D5908>
<__main__.A object at 0x00000212C48D5908>
2
上述代码中,类A有一个test1方法。两种引用方式说明如下:
1. 通过实例a来引用方法时,python自动将a作为第一个参数(self)传给方法test1。
2. 通过类来直接引用时,需要显式传给test1一个self参数,但是这个参数并不要求一定要是类的实例,传入其他值亦可(上述代码中传入的是2)。
引用方式的问题与优点:
class A:
def test2():
print("hello") def test3(solf):
print(solf) class B:
pass def main():
a = A()
try:
a.test2()
except Exception as e:
print(e)
b = B()
A.test3(b) if __name__ == "__main__":
main()
输出结果:
test2() takes 0 positional arguments but 1 was given
<__main__.B object at 0x000001DFE1AC7898>
由于实例引用会隐式传入实例作为方法的第一个参数,所以当类的方法不接受参数的时候,使用实例就无法调用该方法。
类引用的显式传参没有要求,所以可以将A类的方法作用于B上。
类方法(classmethod)和静态方法(staticmethod):
class A:
@classmethod
def test4(self):
print(f"classmethod: {self}") @staticmethod
def test5(self):
print(f"staticmethod: {self}") def main():
a = A()
a.test4()
A.test4()
a.test5(2)
A.test5(2) if __name__ == "__main__":
main()
输出结果:
classmethod: <class '__main__.A'>
classmethod: <class '__main__.A'>
staticmethod: 2
staticmethod: 2
类方法和静态方法使用装饰器实现,和普通的方法有所区别。
从作用上看:
1. 类方法是只与类相关,而与类的实例无关的方法。
2. 静态方法是与类和实例都无关的方法。
从实现上看:
1. 类方法和静态方法统一了实例引用和类引用,两者都能通过两种引用方式调用。
2. 类方法永远隐式地使第一个传入的参数为类,静态方法所有参数都需要显示传入。
总结:
1. 类属性引用有两种,分为实例引用和类引用,对于方法属性,前者隐式传入实例作为第一个参数,后者类似于普通函数
2. self和cls是约定的实例和类的名称表示,并无强制性含义,类引用时可以传入任意值而不一定是类实例
3. 类方法与静态方法统一了两种引用方式,前者永远隐式传入类作为第一个参数,后者所有参数都需要显示传入。
python tips:类的绑定方法(bound)和非绑定方法(unbound)的更多相关文章
- python3 封装之property 多态 绑定方法classmethod 与 非绑定方法 staticmethod
property 特性 什么是特性property property 是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值 例如 BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而 ...
- 是否可以从一个static方法内部调用非static方法?
不可以.静态成员不能调用非静态成员. 非static方法属于对象,必须创建一个对象后,才可以在通过该对象来调用static方法.而static方法调用时不需要创建对象,通过类就可以调用该方法.也就是说 ...
- python tips:类与实例的属性问题
实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性. 实例1: class A: work = list("hello&q ...
- java 多线程阻塞队列 与 阻塞方法与和非阻塞方法
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- Java-main方法中调用非static方法
java的calss中,在public static void main(String[] args) { }方法中调用非static的方法:在main方法中创建该calss的对象,用对象调用非sta ...
- python tips:类的动态绑定
使用实例引用类的属性时,会发生动态绑定.即python会在实例每次引用类属性时,将对应的类属性绑定到实例上. 动态绑定的例子: class A: def test1(self): print(&quo ...
- Python面向对象 --- 类的设计和常见的内置方法
面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...
- python tips:类的专有属性
实例通常能够调用类的属性,但是有些属性是类专有的,实例无法调用. 实例调用方法时查找属性时,首先在自己的__dict__中找,找不到去类中找,在类中能够找到的属性都位于dir(cls)中,如果类的某些 ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
随机推荐
- N天学习一个linux命令之ssh
用途 通过加密连接,远程登录主机和在远程主机执行命令,也可以用于转发x11和tcp,也可用于搭建VPN.第一次连接时,会弹出远程主机公钥指纹确认信息,通过这个方式防止中间人攻击. 用法 ssh [op ...
- backup script
#!/bin/bash ##################################################### # export the whole database use ex ...
- [E2E] Visual Differing Tests with Puppeteer and PixelMatch
Take your end to end tests to the next level by comparing your current application's view with an al ...
- c#面试题总结
using System; class A { public A() { PrintFields(); } public virtual void PrintFields(){} } class B: ...
- Android 实现文字与图片的混排
在我们的项目中,常常会碰到图片与文字混排的问题.解决这类问题的方法有非常多,本文给出的方法不是唯一的.仅仅有依据实际场景才干找到更适合的方法. 本文主要通过xml布局来实现图片与文字的混排(水平排列) ...
- UVa 10693 - Traffic Volume
題目:車速為v,車之間的距離最少為v^2/(2f)(防止裝車),車長為L,問1小時最多能走過幾輛車. 分析:數學.物理. 根據題意能够列出方程:nL + (n-1)d = nL ...
- JS0基础学习笔记(1)
为了须要,最近開始学习JS相关知识.基本的方式是通过看视频以及查阅相关手冊.并动手实践,亲手写出每一个小案例,以下是相关代码(每一个案例用分隔线隔开). <!DOCTYPE html> & ...
- B1295 [SCOI2009]最长距离 最短路
就是一道最短路的裸题,直接跑spfa就行了.(spfa死了) 最后在答案处判断是否障碍物太多,然后就直接找最大值就行. (数据特别水,我错误算法60) 题干: Description windy有一块 ...
- PCB 奥宝LDI 输出正负片转换关系
今天继续对P2 奥宝LDI改造,在文件输出的时候遇到了一个正负片转换问题,研究了半天一直没有得到解决, 回来后前前后后整理今天参数输出与输出的关系,最终还梳理清楚了, 今天小结:一项技术只要用心去研究 ...
- E20170907-ts
flash vt. 使闪光,使闪烁; 拍出,发出(电报等); 〈口〉炫耀; adj. 闪光的,闪耀的,一闪而过的; 浮华的; 庞大的; n. 闪光; 闪光灯下摄 ...