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

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)的更多相关文章

  1. python3 封装之property 多态 绑定方法classmethod 与 非绑定方法 staticmethod

    property 特性 什么是特性property property 是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值 例如 BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而 ...

  2. 是否可以从一个static方法内部调用非static方法?

    不可以.静态成员不能调用非静态成员. 非static方法属于对象,必须创建一个对象后,才可以在通过该对象来调用static方法.而static方法调用时不需要创建对象,通过类就可以调用该方法.也就是说 ...

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

    实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性. 实例1: class A: work = list("hello&q ...

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

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  5. Java-main方法中调用非static方法

    java的calss中,在public static void main(String[] args) { }方法中调用非static的方法:在main方法中创建该calss的对象,用对象调用非sta ...

  6. python tips:类的动态绑定

    使用实例引用类的属性时,会发生动态绑定.即python会在实例每次引用类属性时,将对应的类属性绑定到实例上. 动态绑定的例子: class A: def test1(self): print(&quo ...

  7. Python面向对象 --- 类的设计和常见的内置方法

    面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...

  8. python tips:类的专有属性

    实例通常能够调用类的属性,但是有些属性是类专有的,实例无法调用. 实例调用方法时查找属性时,首先在自己的__dict__中找,找不到去类中找,在类中能够找到的属性都位于dir(cls)中,如果类的某些 ...

  9. 类的封装,property特性,类与对象的绑定方法和非绑定方法,

    类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...

随机推荐

  1. IDFTP连不上FTP服务器的解决方法

    使用IDFTP连不上FTP服务端. 原来是IDFTP有2种模式:主动模式和被动模式. IDFTP默认是使用主动模式,如果FTP服务端设置使用被动模式,使用IDFTP连不上FTP服务端的. 解决方法: ...

  2. Bootstrap基础--文本对齐风格

    在排版中离不开文本的对齐方式.在CSS中常常使用text-align来实现文本的对齐风格的设置.其中主要有四种风格: ☑  左对齐,取值left ☑  居中对齐,取值center ☑  右对齐,取值r ...

  3. PHP array_count_values()

    定义和用法 array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键(索引)是原数组的值,元素的值是该值在原数组中出现的次数. 语法 array_ ...

  4. org.hibernate.PropertyValueException: not-null property references a null or transient value: model.

    今天在写一个SSH整合的项目时,首先将数据库操作部分单独分离出来,写完后使用Junit进行測试,经过測试.发现没有不论什么问题,对数据库中的内容进行增删改查没有问题,可是将他整合到SSH的项目中时,报 ...

  5. Codeforces Round #250 Div. 2(C.The Child and Toy)

    题目例如以下: C. The Child and Toy time limit per test 1 second memory limit per test 256 megabytes input ...

  6. Homebrew 命令

    安装(需要 Ruby):ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" 搜索 ...

  7. oc55--ARC单个对象的内存管理

    // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end // Person.m #i ...

  8. oc37--类工厂方法

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...

  9. 二分图染色模板(P1330 封锁阳光大学)

    二分图染色模板(P1330 封锁阳光大学) 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校 ...

  10. 3.2 手机中的数据库——SQLite

    http://www.sqlite.org/download.html 截至我安装SQLite数据库为止的时间,最新的版本可以下载sqlite-dll-win64-x64-3200000.zip和sq ...