我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python记录_day18 反射 判断

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python记录_day18 反射 判断

一、三个内置函数

1、issubclass(a, b)  判断a类是否是b类的子类

 1 class Foo:
 2     pass
 3 
 4 class Zi(Foo):
 5     pass
 6 
 7 class Sun(Zi):
 8     pass
 9 print(issubclass(Zi,Foo))  #True
10 print(issubclass(Zi,Sun))  # False
issubclass

 

2、type(对象)   返回该对象的数据类型,精确识别(即不向上兼容)  

 1 class Animal:
 2     pass
 3 
 4 class Cat(Animal):
 5     pass
 6 
 7 class BosiCat(Cat):
 8     pass
 9 
10 c = Cat()    
11 b = BosiCat()
12 print(type(c))   #<class '__main__.Cat'>  会准确说出c是一种Cat,不会说c是一种Animal
type

 

3、isinstance(对象,类)   判断xx对象是否是xxx类 (向上兼容)

class Animal:
    pass

class Cat(Animal):
    pass

class BosiCat(Cat):
    pass

c = Cat()
b = BosiCat()

print(isinstance(c , Cat))     #判断c 是否是一种Cat
print(isinstance(c,Animal))    #判断c 是否是一种Animal
print(isinstance(c,BosiCat))
 
结果:
True
True
False
isinstace

 

二、判断函数与方法

python官方定义:

函数function —— A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.

方法method —— A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).

从定义看,函数就相当于一个数学公式,它不与其他东西相互关联,传递相应的参数就能用。而方法是,定义在类内部的函数,并且这个函数和类或类的实例对象有某种关联,访问时会自动传递一个参数作为第一参数。

简单来说:

函数没和类或对象进行绑定;

方法和类或对象有绑定

# 区分函数和方法:

 1 def func():
 2  pass
 3 print(func) # <function func at 0x10646ee18>  函数
 4 class Foo:
 5 
 6  def chi(self):
 7  print("我是吃")
 8 f = Foo()
 9 print(f.chi) # <bound method Foo.chi of <__main__.Foo object at
10 0x10f688550>>    方法
函数和方法
 1 class Foo:
 2      def chi(self):
 3          print("我是吃")
 4      @staticmethod
 5      def static_method():
 6          pass
 7      @classmethod
 8      def class_method(cls):
 9          pass
10 
11 f = Foo()
12 
13 print(f.chi) # <bound method Foo.chi of <__main__.Foo object at
14 0x10f688550>>
15 
16 print(Foo.chi) # <function Foo.chi at 0x10e24a488>
17 print(Foo.static_method) # <function Foo.static_method at 0x10b5fe620>
18 print(Foo.class_method) # bound method Foo.class_method of <class
19 '__main__.Foo'>>
20 
21 print(f.static_method) # <function Foo.static_method at 0x10e1c0620>
22 print(f.class_method) #<bound method Foo.class_method of <class
23 '__main__.Foo'>>            
函数和方法

结论:

1. 类方法. 不论任何情况, 都是方法.

2. 静态方法, 不论任何情况. 都是函数

3. 实例方法, 如果是实例访问. 就是方法. 如果是类名访问就是函数.

#官方判断方法:

通过types模块引入MethodType  FunctionType 来判断

 1 from types import FunctionType, MethodType
 2 
 3 class Car:
 4     def run(self): # 实例方法
 5         print("我是车, 我会跑")
 6 
 7     @staticmethod
 8     def cul():
 9         print("我会计算")
10 
11     @classmethod
12     def jump(cls):
13         print("我会jump")
14 
15 c = Car()
16 
17 实例方法:
18 #     1. 用对象.方法   方法
19 #     2. 类名.方法     函数
20 c = Car()
21  print(isinstance(c.run, FunctionType)) # False
22  print(isinstance(Car.run, FunctionType)) # True
23  print(isinstance(c.run, MethodType)) # True
24  print(isinstance(Car.run, MethodType)) # False
25 
26 # 静态方法 都是函数
27  print(isinstance(c.cul, FunctionType)) # True
28  print(isinstance(Car.cul, FunctionType)) # True
29  print(isinstance(c.cul, MethodType)) # False
30  print(isinstance(Car.cul, MethodType)) # False
31 
32 # 类方法都是方法
33 print(isinstance(c.jump, FunctionType)) # False
34 print(isinstance(Car.jump, FunctionType)) # False
35 print(isinstance(c.jump, MethodType)) # True
36 print(isinstance(Car.jump, MethodType)) # True
判断

 

三、反射(重点)

关于反射, 其实一共有4个函数:

1. hasattr(obj, str)   判断obj中是否包含str成员

2. getattr(obj,str)    从obj中获取str成员

3. setattr(obj, str, value)     把obj中的str成员设置成value      这里的value可以是值, 也可以是函数或者方法

4. delattr(obj, str) 把obj中的str成员删除掉

注意:

obj可以是模块,类,实例对象

以上操作都是在内存中进行的, 并不会影响你的源代码,但是在同一个py文件中,你通过反射修改了类,是会影响到其他对象的。

 

 1 #反射用到的四个函数,常用的是hasattr 和getattr
 2 # setattr(a,b,c)  a是要操作的对象,b是操作对象中的成员字符串形式,c是修改的值
 3 # getattr(a,b)     有返回值,返回值形式a.b    a是要操作的对象,b是操作对象中的成员字符串形式
 4 #delattr(a,b)      a是要操作的对象,b是操作对象中的成员字符串形式
 5 #hasatter(a,b)     a是要操作的对象,b是操作对象中的成员字符串形式
 6 
 7 class Car:
 8 
 9     def __init__(self,color,pai,price):
10         self.color = color
11         self.pai = pai
12         self.price= price
13 
14     def fly(self):
15         print('我的车会飞')
16 
17 c = Car('blue','丰田','18888')
18 f = getattr(Car,"fly")    #操作对象是类,返回值相当于Car.fly
19 print(f)      #<function Car.fly at 0x0000000001EA9D08> 这里是函数,没有和类绑定,所以需要下面手动传值
20 f(c)       # f是函数,没有和类绑定,所以需要手动传值Car.fly(c) ,它是等价于c.fly()的
21 
22 #delattr(Car,"fly")    #操作的是类,把类中fly方法删除了
23 #c.fly()     #报错,没有fly
24 
25 c2 =Car("yellow","bmw",20000)
26 
27 def fly():
28     print("通过对象c修改fly方法")
29     
30 setattr(c,"fly",fly)         #并没有改变类中的内容,相当于在当前对象中创建了一个fly方法,一个对象是不可能有修改类的权限的
31 c.fly()       #通过对象c修改fly方法
32 c2.fly()     #我的车会飞
33 c3 = Car("blue","奔驰",88888)
34 c3.fly()      #我的车会飞
35 setattr(Car,'fly',lambda self:print('通过类名,修改fly方法')) #通过类名修改fly方法
36 c.fly()     #通过对象c修改fly方法
37 c2.fly()   #通过类名,修改fly方法
38 c3.fly()  #通过类名,修改fly方法
39 c4 = Car("red","悍马",66666)
40 c4.fly()     #通过类名,修改fly方法

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python记录_day18 反射 判断

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

下载Word文档

猜你喜欢

python记录_day18 反射 判断

一、三个内置函数1、issubclass(a, b)  判断a类是否是b类的子类 1 class Foo: 2 pass 3 4 class Zi(Foo): 5 pass 6 7 class Sun(Zi): 8
2023-01-30

python目录判断与创建

1、完成目录判断2、完成文件创建3、完成cpickle模块化写与读import cPickle as p,osdirlis = os.getcwd() dirlis_new = dirlis + "\\"+"pytTest" p
2023-01-31

判断sqlserver中哪个表的记录多

select id,OBJECT_NAME(id) AS tablename, indid,rows,rowcnt from sys.sysindexes a where indid in (0,1) order by rows desc
2017-09-21

怎么使用sql语句insert之前判断是否已存在记录

今天就跟大家聊聊有关怎么使用sql语句insert之前判断是否已存在记录,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。sql语句insert之前判断是否已存在记录INSERT INT
2023-06-22

java判断当前日期时间大于指定日期时间 记录日常开发中的小搜索

可以使用Java中的 Calendar 类来获取当前时间和所需的指定时间并将它们进行比较。这是一个示例代码: import java.util.Calendar;public class Main { public static vo
2023-08-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录