面向对象之(非)绑定方法,反射,isinstance与issubclass

 


isinstance(obj,cls)和issubclass(sub,super)#

isinstance(obj,cls)检查obj是否是类 cls 的对象

1
2
3
4
class Foo(object):
    pass
obj = Foo()
isinstance(obj, Foo)

issubclass(sub, super)检查sub类是否是 super 类的派生类

1
2
3
4
5
6
class Foo(object):
    pass
class Bar(Foo):
    pass
  
issubclass(Bar, Foo)

绑定方法与非绑定方法#

绑定方法#

绑定给谁,谁来调用就自动将它本身当作第一个参数传入

绑定方法分为绑定到类的方法和绑定到对象的方法,具体如下:

非绑定方法:用staticmethod装饰器装饰的方法#

对于绑定方法和非绑定方法举个例子#

绑定方法#

绑定给对象的方法(略)

绑定给类的方法(classmethod)

  classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法

  

非绑定方法#

在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数

statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果

绑定方法与非绑定方法的使用举例#

classmethod 与 staticmethod的区别#

 

类方法,静态方法的定义#

        Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是一些函数,调用的时候导入模块,通过模块名.函数名()即可调用,完全不需要类,那么你可能会问,那要类还有什么毛用? 类就是用来面向对象编程啦,类可以有自己的属性,类可以创建很多实例,每个实例可以有不同的属性,这也就保存了很多私有的数据,总之都有存在的必要.

面向对象程序设计中,类方法和静态方法是经常用到的术语,逻辑上将:类方法只能由类名调用,静态方法可以由类名或者对象名调用。在python 语法中,类有三种方法,分别是实例方法,静态方法,类方法

可以看出:

实例方法只能被实例对象调用,静态方法(由@staticmethod装饰的方法)、类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用。
实例方法,第一个参数必须要默认传实例对象,一般习惯用self。对象方法中有self参数,类方法有cls参数,静态方法是不需要这些附加参数(在c++中,是没有类这个概念)

静态函数(@staticmethod):即静态方法,静态方法是一类特殊的方法,有时候你可能需要填写一个属于这个类的方法,但是这些代码完全不会使用到实例对象本身。它主要处理这个类的逻辑关联,如验证数据;而且对参数没有要求。

类方法(@classmethod):即类方法,类方法不是绑定到对象上,而是绑定在类上的方法,它更关注于从类中调用方法,而不是从实例中调用方法,如构造重载;

成员函数:实例的方法,只能通过实例进行调用;第一个参数必须要默认传类,一般习惯用cls。

类方法与静态方法说明#

  1:self表示为类型为类的object,而cls表示为类也就是class

  2:在定义普通方法的时候,需要的是参数self,也就是把类的实例作为参数传递给方法,如果不写self的时候,会发现报错TypeError错误,表示传递的参数多了,其实也就是调用方法的时候,将实例作为参数传递了,在使用普通方法的时候,使用的是实例来调用方法,不能使用类来调用方法,没有实例,那么方法将无法调用。

  3:在定义静态方法的时候,和模块中的方法没有什么不同,最大的不同就是在于静态方法在类的命名空间之间,而且在声明静态方法的时候,使用的标记为@staticmethod,表示为静态方法,在你用静态方法的时候,可以使用类名或者是实例名来进行调用,一般使用类名来调用

  4:静态方法主要是用来放一些方法的,方法的逻辑属于类,但是有何类本身没有什么交互,从而形成了静态方法,主要是让静态方法放在此类的名称空间之内,从而能够更加有组织性。

  5:在定义类方法的时候,传递的参数为cls.表示为类,此写法也可以变,但是一般写为cls。类的方法调用可以使用类,也可以使用实例,一般情况使用的是类。

  6:在重载调用父类方法的时候,最好是使用super来进行调用父类的方法。静态方法主要用来存放逻辑性的代码,基本在静态方法中,不会涉及到类的方法和类的参数。

  7:python中实现静态方法和类方法都是依赖python的修饰器来实现的。静态方法是staticmethod,类方法是classmethod

  8:在继承的时候,静态方法和类方法都会被子类继承。在进行重载类中的普通方法的时候,只要 写上相同的名字即可进行重载。

静态方法,类方法的使用区别#

1:类方法用在模拟java定义多个构造函数的情况

由于python类中只能有一个初始化方法,不能按照不同的情况初始化类,举例如下:

2:类中静态方法方法调用静态方法的情况

下面的代码,静态方法调用另一个静态方法,如果改用类方法调用静态方法,可以让cls代替类,(让代码看起来精简一些,也防止类名修改了,不用在类定义中修改原来的类名)

 

小练习    定义MySQL类

  1.对象有id、host、port三个属性

  2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一

  3.提供两种实例化方式,方式一:用户传入host和port 方式二:从配置文件中读取host和port进行实例化

  4.为对象定制方法,save和get_obj_by_id,save能自动将对象序列化到文件中,文件路径为配置文件中DB_PATH,文件名为id号,保存之前验证对象是否已经存在,若存在则抛出异常,;get_obj_by_id方法用来从文件中反序列化出对象

 

  

  

  

反射

为什么要用反射#

什么是反射#

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)#

四个可以实现自省的函数

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

hasattr(object,name) 判断object中有没有对应的方法和属性

1
判断object中有没有一个name字符串对应的方法或属性

  

getattr(object, name, default=None)  获取object中有没有对应的方法和属性

  

setattr(x, y, v) 设置对象及其属性

  

delattr(x, y) 删除类或对象的属性

  

四个方法的使用演示

类也是对象

反射当前模块成员

导入其他模块,利用反射查找该模块是否存在某个方法

module_test.py

1
2
3
# _*_ coding: utf-8 _*_
def test():
    print('from the test') 

为什么用反射?(反射的好处)#

好处一:实现可插拔机制

有俩程序员,一个james,一个是dunart,james在写程序的时候需要用到dunart所写的类,但是dunart去跟女朋友度蜜月去了,还没有完成他写的类,james想到了反射,使用了反射机制james可以继续完成自己的代码,等dunart度蜜月回来后再继续完成类的定义并且去实现james想要的功能。

总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能

dunart还没有实现全部功能

不影响james的代码编写

好处二:动态导入模块(基于反射当前模块成员)

 

__setattr__,__delattr__,__getattr__

三者的用法演示#

  

 

posted @   鲸鱼的海老大  阅读(241)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
CONTENTS