广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python面向对象之反射和内置方法
  • 114
分享到

python面向对象之反射和内置方法

反射面向对象方法 2023-01-31 00:01:46 114人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和

一、静态方法(staticmethod)和类方法(classmethod)

类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性)

静态方法:让类里的方法直接被类调用,就像正常调用函数一样

类方法和静态方法的相同点:都可以直接被类调用,不需要实例化

类方法和静态方法的不同点:

  类方法必须有一个cls参数表示这个类,可以使用类属性

  静态方法不需要参数

绑定方法:分为普通方法和类方法

     普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定到对象

      类方法:默认有一个cls对象传进来,并且可以被类和对象(不推荐)调用-----绑定到类

非绑定方法:静态方法:没有设置默认参数,并且可以被类和对象(不推荐)调用-----非绑定

class Student:
 2     f = open('student', encoding='utf-8')
 3     def __init__(self):
 4         pass
 5     @claSSMethod #类方法 :有个默认参数cls,并且可以直接使用类名去
 6                  #调用,还可以与类属性交互(也就是可以使用类属性)
 7     def show_student_info_class(cls):
 8         # f = open('student', encoding='utf-8')
 9         for line in cls.f:
10             name,sex = line.strip().split(',')
11             print(name,sex)
12     @staticmethod  #静态方法:可以直接使用类名去调用,就像正常的函数调用一样
13     def show_student_info_static(): #不用传self
14         f = open('student',encoding='utf-8')
15         for line in f:
16             name,sex = line.strip().split(',')
17             print(name,sex)
18 # eGon = Student()
19 # egon.show_student_info_static()  #也可以这样调,但是还是推荐用类名去调
20 # egon.show_student_info_class()
21 
22 Student.show_student_info_class()#类名.方法名()
23 print('-------------------')
24 Student.show_student_info_static()#类名.方法名()

一、isinstance 和 issubclass

isinstance(obj,cls):检查obj是不是cls的对象(传两个参数,一个是对象,一个是类)

issubclass(sub,super):检查sub是不是super的子类(传两个参数,一个是子类,一个是父类)

复制代码
 1 class Foo:
 2     pass
 3 class Son(Foo):
 4     pass
 5 s = Son()
 6 print(isinstance(s,Son))  #判断s是不是Son的对象
 7 print(type(s) is Son)
 8 print(isinstance(s,Foo))  #判断s是不是Foo的对象  不精准
 9 print(type(s) is Foo)  #type比较精准
10 
11 print(issubclass(Son,Foo)) #判断Son是不是Foo的子类
12 print(issubclass(Son,object))
13 print(issubclass(Foo,object))
14 print(issubclass(int,object))
复制代码

二、反射

反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射。

反射有四种方法:

hasattr:hasattr(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False

getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr和getattr配套使用

    需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()

setattr:给对象的属性赋值,若属性不存在,先创建后赋值

delattr:删除该对象指定的一个属性

class Foo:
 2     def __init__(self):
 3         self.name = 'egon'
 4         self.age = 51
 5     def func(self):
 6         print('hello')
 7 egg = Foo()
 8 setattr(egg,'sex','男')
 9 print(egg.sex)
10 # 2.
11 def show_name(self):
12     print(self.name+'sb')
13 setattr(egg,'sh_name',show_name)
14 egg.sh_name(egg)
15 show_name(egg)

 

delattr(egg,'name')
2 print(egg.name)

1.对象应用反射
class Foo:
 2     def __init__(self):
 3         self.name = 'egon'
 4         self.age = 51
 5     def func(self):
 6         print('hello')
 7 egg = Foo()
 8 print(hasattr(egg,'name'))  #先判断name在egg里面存在不存在
 9 print(getattr(egg,'name')) #如果为True它才去得到
10 print(hasattr(egg,'func'))
11 print(getattr(egg,'func'))  #得到的是地址
12 # getattr(egg,'func')()  #在这里加括号才能得到,因为func是方法
13 if hasattr(egg,'func'):
14     getattr(egg,'func')()
15 else:
16     print('没找到')

2.类应用反射
class Foo:
 2     f = 123
 3     @classmethod
 4     def class_method_dome(cls):
 5         print('class_method_dome')
 6 
 7     @staticmethod
 8     def static_method_dome():
 9         print('static_method_dome')
10 print(hasattr(Foo,'class_method_dome'))
11 method = getattr(Foo,'class_method_dome')
12 method()
13 print('------------')
14 print(hasattr(Foo,'static_method_dome'))
15 method1 = getattr(Foo,'static_method_dome')
16 method1()

3.模块应用反射

 模块的应用又分为导入其他模块反射和在本模块中反射

# 1.导入其他模块引用
2 import mymodule
3 print(hasattr(mymodule,'test'))
4 getattr(mymodule,'test')()
5 
6 # # 这里的getattr(mymodule,'test')()这一句相当于
7 # p = getattr(mymodule,'test')
8 # p()

# 2.在本模块中应用反射
2 def demo1():
3     print('wwww')
4 import sys
5 # print(sys.modules)
6 module_obj = sys.modules[__name__]  #相当于'__main__'
7 print(module_obj)
8 print(hasattr(module_obj,'demo1'))
9 getattr(module_obj,'demo1')()

# 举例
 2 def 注册():
 3     print('regiester')
 4 def 登录():
 5     print('login')
 6 def 购物():
 7     pass
 8 print('注册,登录,购物')
 9 ret = input('请输入你要做的操作:')
10 import sys
11 my_module = sys.modules[__name__]  #利用sys模块导入一个自己的模块
12 if hasattr(my_module,ret):
13     getattr(my_module,ret)()

反射补充:

db.Mysql

class mysqlHelper(object):
    print('MysqlHelper1111111')
    def fetchone(self):
        print('你好')

db.pool

class PoolHelper(object):
    print('PoolHelper')

settings.py

复制代码
DB_PATH = 'db.mysql.MySQlHelper'

#吧字符串切割
module_name,cls_name = DB_PATH.rsplit('.',maxsplit=1)
# print(module_name,cls_name)  #db.mysql    MySQlHelper
#导入模块
# from db.mysql import MySQlHelper
import importlib
moudel_obj = importlib.import_module(module_name)
print(moudel_obj,type(moudel_obj))
#导入模块中的类
cls = getattr(moudel_obj,cls_name)
print(cls)
#对类进行实例化
obj = cls()
obj.fetchone()
# getattr()
复制代码

三、内置方法

1.__str__和__repr__

改变对象的字符串显示

class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4     def __repr__(self):
 5         return 'obj in str'  #这里只能是return
 6     # def __str__(self):
 7     #     return '%s obj in str'%self.name
 8 f = Foo('egon')
 9 print(f)  #优先执行__str__里面的内容
10 # 那么你是不是据地__repr__没用呢?
11 # print('%s'%f)  #执行的是__str__里面的返回值
12 # print('%r'%f)  #执行的是__repr__里面的返回值
13 print('==============')
14 print(str(f))  #当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
15 print(repr(f))
16 #1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
17 # 2.当__str__没有被实现的时候,就会调用__repr__方法
18 # 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
19 # 4.不管是在字符串格式化的时候还是在打印对象的时候,
20 # __repr__方法都可以作为__str__方法的替补,但反之则不行
21 # 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个:先实现__repr__

 

2.__del__

析构方法,当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

复制代码
1 class Foo:
2     def __del__(self):
3         print('执行我啦')
4 
5 f= Foo()
6 print(123)
7 print(123)
8 print(123)
9 print(123)
复制代码

3.item系列

分别有__getitem__      ,__setitem__    ,__delitem__

class Foo:
 2     def __init__(self):
 3         self.name = 'egon'
 4         self.age = 73
 5         self.l=[1,2,3]
 6     def __getitem__(self, item):  #得到
 7         # return  self.l[item]
 8         # return self.__dict__[item]
 9         # print(Foo.__dict__)
10         return 123
11     def __setitem__(self, key, value):  #修改
12         print(key,value)
13         self.__dict__[key] = value
14     def __delitem__(self, key):  #删除
15         del self.__dict__[key]
16 f = Foo()
17 print(f['qqq'])  #不管里面放的啥值,它都会得到返回值的内容,调用的是__getitem__方法
18 f['name']='alex' #修改egon的值为alex,调用 __setitem__方法
19 # del f['name'] #删除name,就会报错了,说明在调用__delitem__方法调用成功了,就已经删了,就会报错了
20 print(f.name) 
21 f1 = Foo()
22 print(f == f1)
23 # print(f.name)
24 # print(f[0])  #一开始不能这样取值,但是提供了一个__getitem__方法,这样就可以用了
25 # print(f[1])
26 # print(f[2])

4.__new__(创建)
# 4.__new__方法
 2 # 单例模式:是一种设计模式
 3 class Singleton:
 4     def __new__(cls, *args, **kw):
 5         if not hasattr(cls, '_instance'):
 6             orig = super(Singleton, cls)
 7             cls._instance = orig.__new__(cls, *args, **kw)
 8         return cls._instance
 9 
10 one = Singleton()
11 two = Singleton()
12 print(one,two)   #他们两个的地址一样
13 
14 one.name = 'alex'
15 print(two.name) 

 

# class A:
 2 #     def __init__(self):  #有一个方法在帮你创造self
 3 #         print('in init function')
 4 #         self.x = 1
 5 #
 6 #     def __new__(cls, *args, **kwargs):
 7 #         print('in new function')
 8 #         return object.__new__(A, *args, **kwargs)
 9 # a = A()
10 # b = A()
11 # c = A()
12 # d = A()
13 # print(a,b,c,d)

5.__call__

对象后面加括号,触发执行

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
2     def __call__(self, *args, **kwargs):
3         print(123)
4 # f = Foo()
5 # f() #如果不写上面的__call__方法,就不会调用。如果加上,就正确了
6 Foo()() #也可以这样表示

6.__len__

7.__hash__
class Foo:
2     def __hash__(self):
3         print('aaaaaaaaaa')
4         return hash(self.name)
5         # print('aaas')
6 f = Foo()
7 f.name = 'egon'
8 print(hash(f))  #hash方法是可以重写的

 8.__eq__

class A:
2     def __eq__(self, other):
3         return True
4 a = A()
5 b = A()
6 print(a==b) #不加方法的时候返回的是False,加了个__eq__方法就返回了个True
7 # '=='内部就调用了__eq__方法
8 print(a is b)


--结束END--

本文标题: python面向对象之反射和内置方法

本文链接: https://www.lsjlt.com/news/182446.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python面向对象之反射和内置方法
    一、静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和...
    99+
    2023-01-31
    反射 面向对象 方法
  • python面向对象之反射
    一、静态方法(staticmethod)和类方法(classmethod)类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)静态方法:让类里的方法直接被类调用,就像正常调用函数一样类方法和静态方...
    99+
    2023-01-31
    反射 面向对象 python
  • python面向对象(反射)(四)
    1. isinstance, type, issubclass     isinstance: 判断你给对象是否是xx类型的. (向上判断     type: 返回xxx对象的数据类型     issubclass: 判断xxx类是...
    99+
    2023-01-30
    反射 面向对象 python
  • python3--面向对象进阶之内置方法
    __str__和__repr__改变对象的字符串显示__str__, __repr__示例class List:     def __init__(self, *args...
    99+
    2023-01-30
    进阶 面向对象 方法
  • 第27天面向对象之反射,绑定方法,特定的
    绑定方法与非绑定方法 绑定方法(其实并没有这样的说法,只是为了解释三个装饰器而说出来的比较容易记名词)  绑定方法的核心就是,谁绑定的就应该给谁来调用,谁来调用我们就会将谁作为第一个参数传递进去。  绑定对象方法:应该被对象来调用,py...
    99+
    2023-01-30
    绑定 反射 面向对象
  • python 面向对象之类方法
    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量举个例子class Dog(object):     def __i...
    99+
    2023-01-30
    面向对象 方法 python
  • python 面向对象之静态方法
    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不...
    99+
    2023-01-30
    静态 面向对象 方法
  • Python面向对象之类和对象
    目录类定义类定义类和属性类中方法对象方法(普通方法)类方法静态方法魔术方法对象创建对象对象属性总结 类 定义类 所有类名首字母要求大写,多个单词时遵循驼峰命名法 所...
    99+
    2022-11-12
  • Python面向对象的内置方法梳理讲解
    目录1、__str__2、__del__方法3、__call__首先class类里的内置方法,比如:__call__,__str__这些都是在一定条件下自动运行的。 下面我们来介绍几...
    99+
    2022-11-11
  • Python面向对象之入门类和对象
    目录什么是面向对象编程?定义类,从具体代码来感受吧!多个类和对象的观察补充一下类的属性(数据部分)总结什么是面向对象编程? 我们是不是听过面向过程,拿来放在一起对比就比较好理解了。 ...
    99+
    2022-11-12
  • python3--面向对象内置方法例子,python异常处理
    from collections import namedtuple Card = namedtuple('Card', ['ranks',&nbs...
    99+
    2023-01-30
    面向对象 例子 异常
  • Java 面向对象 之 封装方法
    转载于 : http://www.verejava.com/id=16992728331734 public class Encapsulation {public static&...
    99+
    2023-06-02
  • Python入门之面向对象和类
    目录一、两大编程思想二、类与对象三、定义Python中的类四、对象创建五、类属性、类方法、静态方法六、动态绑定属性和方法七、面向对象的三大特征八、方法重写总结一、两大编程思想 二、...
    99+
    2022-11-12
  • python 面向对象之class和封装
    # 封装 # Python并没有真正的私有化支持,但可用下划线得到伪私有 访问私有变量:实例._类名__变量名 访问私有方法:实例._类名__方法名() class Wife02(...
    99+
    2022-11-12
  • Python面向对象之模块和包
    模块 模块的概念 模块是Python程序架构的一个核心概念 所有以.py结尾的源文件都是一个模块; 模块名也是标识符,需要遵循标识符的命名规则; 在模块中定义的全局变量,类,函数,都是直接给外界使用的工具; 模块就好比一个工具包,而...
    99+
    2023-01-31
    面向对象 模块 Python
  • Python面向对象之内置函数相关知识总结
    Python内置函数 1. classmethod、staticmethod、property 。 上述三个内置函数在文章(Python进阶——面向对象之成员)的方法和属性中已经详细...
    99+
    2022-11-12
  • python面向对象基础之常用魔术方法
    目录一、类和对象二、魔法方法三、理解self四、练习对战一、类和对象 通俗理解:类就是模板,对象就是通过模板创造出来的物体 类(Class)由3个部分构成: 类的名称: 类名 类的...
    99+
    2022-11-12
  • Java面向对象之方法中内部类的示例分析
    这篇文章主要为大家展示了“Java面向对象之方法中内部类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java面向对象之方法中内部类的示例分析”这篇文章吧。public cl...
    99+
    2023-06-02
  • python基础之函数和面向对象详解
    目录函数函数参数变量作用域内嵌函数和闭包lambda 表达式面向对象三大特性类、类对象 和 实例对象类属性 和 对象属性私有魔法方法基本的魔法方法算术运算符属性访问 描述符...
    99+
    2022-11-13
  • Python面向对象里常见的内置成员介绍
    好嘞,今天我们继续剖析下Python里的类。[[441842]]先前我们定义类的时候,使用到了构造函数,在Python里的构造函数书写比较特殊,他是一个特殊的函数__init__,其实在类里,除了构造函数还有很多其他格式为__XXX__的函...
    99+
    2023-05-14
    开发 Python 函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作