主要内容:

  • isinstance, type, issubclass( 内置函数)
  • 区分函数和方法
  • 反射

一    ( isinstance, type, issubclass)

  1. isinstance()  :可以帮我们判断xx类是否是xx类的子类.  
class Basse:
pass
class Foo:
pass
lass Bar(Foo):
pass
print(issubclass(Bar,Foo)) #true
print(issubclass(Foo,Bar)) #false
print(issubclass(Bar,Basse)) # False

2. type() : 表示查看obj是由哪个类创建的

class Foo:
pass
obj = Foo()
print( obj,type(obj)) # 查看obj的类 <__main__.Foo object at 0x0000019D93228198> <class '__main__.Foo'>
判断好要计算的数据类型必须是int或者float

def add(a, b):
if (type(a) == int or type(a) == float) and (type(b) == int or type(b)
== float):
return a + b
else:
print("我要报错")

3. isinstance() : 也可以判断xxx是YY类型的数据.但是它没有type那么精准.

lass Animal:
pass class Cat(Animal):
pass class BoSiCat(Cat):
pass # a = Animal()
# print(isinstance(a, Animal)) # 自己类可以判断
# print(isinstance(a, Cat)) # 子类不能判断 c = BoSiCat()
print(isinstance(c, Animal)) # True 子类的对象可以当成父类的类型来看.

isinstance 可以判断对象是否是xxx家族体系中的(只能往上判断)

二   区分函数和方法

我们可以直接用打印来看结果

例子

class Foo:
def chi(self):
print("我是吃")
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
f=Foo()
print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x0000023453028588>>
 print(Foo.chi)  #<function Foo.chi at 0x000001AFE215A950
print(f.static_method) #  拿对象来访问function Foo.static_method at 0x0000022A951AA9D8>
print(Foo.static_method) # 拿类来访问<function Foo.static_method at 0x0000014459E4A9D8>
print(f.class_method) #<bound method Foo.class_method of <class '__main__.Foo'>>
print(Foo.class_method) #那类来访问 <bound method Foo.class_method of <class '__main__.Foo'>>

结论:  类方法: 无论任何情况都是方法

静态方法:无论任何情况都是函数

实例方法: 如果是实力访问就是方法,如果是类名访问就是函数

那如何用程序来帮我们分辨到底是函数换是方法呢?

例子:

首先我们要借助typrs模块

# 所有的方法都是Method的实例
#所有的函数都是functiontypes的实例 from types import MethodType,FunctionType #引入模块
def func():
pass
print(isinstance(func,FunctionType)) #true
print(isinstance(func,MethodType)) # false
class Foo:
def chi(self):
print("我是吃")
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
obj=Foo()
print()
print(type(obj.chi)) # method
print(type(Foo.chi)) # function # print(isinstance(obj.chi, MethodType)) # True
# print(isinstance(Foo.chi, FunctionType)) # True
#
# print(isinstance(Foo.static_method, FunctionType)) # True
# print(isinstance(Foo.static_method, MethodType)) # False
#
# print(isinstance(Foo.class_method, FunctionType)) # False
# print(isinstance(Foo.class_method, MethodType)) #true

三 反射

import fanshe  # 引入模块
from types import FunctionType # while :
# print('''大牛写的功能
# chi
# he
# la
# shui
# 调试哪个''')
# ts=input("请输入你要调试的功能")
# if ts=='chi':
# fanshe.chi()
# elif ts=="he":
# fanshe.he()
# elif ts=="la":
# fanshe.la()
# elif ts=='shui':
# fanshe.shui()
# else:
# print("大牛没有这个功能")
#写是写完了. 但是.....如果大牛现在写了了100个功能呢? 你的判断要判断100次么?
# 我们可以使用反射来完成这样的功能. 非常的简单. 想想. 这里我们是不是让用户输入要执行的功能了. 那这个功能就是对应
# 模块里的功能. 那也就是说. 如果能通过字符串来动态访问模块中的功能就能解决这个问题 #例子2
# while :
# print('''大牛写的功能
# chi
# he
# la
# shui
# 调试哪个''')
# ts=input("请输入你要调试的功能")
# func=getattr(fanshe,ts) # geattr (对象,字符串)从对象中获取到xxx功能,此时xxx表示一个字符串,get
# #表示找,attr表示属性功能
# func() ## 写完了 但是这样有个问题在大牛的代码里没有你要找的内容,这时侯就会报错,所以在获取attr之前,要先判断下
#有没有这个功能
# 看下完整代码:
# while :
# print('''大牛写的功能
# chi
# he
# la
# shui
# 调试哪个''')
# ts = input("请输入你要调试的功能")
# if getattr(fanshe, ts): #如果fanshe里有你要的功能
# # 获取这个功能,并执行
# attr=getattr(fanshe,ts)
# if isinstance(attr,FunctionType): #判断是否是函数,只有函数才可以被调用
# attr()
# else: #如果不是就打印
# print(attr) # 两个函数 getattr():来获取信息 从对象中获取xxx功能
# hasattr()用来判断xxx中是否包含了xxx功能
# class person:
# cuontry="daqing"
# def chi(self):
# pass
#
# # 类中的内容可以这样动态的进⾏行行获取
# print(getattr(person, "country"))
# print(getattr(person, "chi")) # 相当于Foo.func 函数
# # 对象⼀一样可以
# obj = person()
# print(getattr(obj, "country"))
# print(getattr(obj, "chi")) # 相当于obj.func ⽅方法
# 总结 getattr可以从模块中获取也可以从类中获取,也可以从类中获取.在python中一切皆对象
# 那可以这样认为.getattr从对象中动态获取成员.
#来看个例子:
class person:
def cih(self):
print("吃")
def he(self):
print("和")
def la(self):
print("啦")
def sa(self):
print("sa")
def shui(self):
print("睡")
def run(self):
lst=['chi','he','la','sa','shui']
num = int(input("""本系统有以下功能
. 吃
. 喝喝
. 拉
. 撒
. 睡
请选择你要执⾏行行的功能:"""))
# func = getattr(Person, lst[num - ])
# func(self)
# 通过对象来访问更更加合理理
# method = getattr(self, lst[num-])
# method()
p=person()
p.run() # 补充:
# 关于反射, 其实一共有4个函数:
# . hasattr(obj, str) 判断obj中是否包含str成员
# . getattr(obj,str) 从obj中获取str成员
# . setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这⾥里里的value可以是
# 值, 也可以是函数或者⽅方法
# . delattr(obj, str) 把obj中的str成员删除掉
# 注意, 以上操作都是在内存中进行的. 并不会影响你的源代码 #setarrt 例子1
# class Foo:
# pass
# f = Foo()
# print(hasattr(f, "chi")) # False
#
# setattr(f, "chi", "")
# print(f.chi) # 被添加了了⼀一个属性信息
#
# setattr(f, "chi", lambda x: x + )
# print(f.chi()) # ## setarrt 例子2 class Person:
def __init__(self, name):
self.name = name
self.age = None def chi(self):
print("人喜欢吃东西%s" % self.name) p = Person("刘伟")
setattr(p, "name", "大阳哥") # 动态的给对象设置属性和值
setattr(p, "age", ) # 很少用. 慎用 print(p.age)
delattr(p, "age")
print(p.age) # p.chi() # val = input("请输入你想让刘伟执行的动作:")
# if hasattr(p, val):
# getattr(p, "name")
# func = getattr(p, val)
# func()

day 017面向对象-反射的更多相关文章

  1. Python之面向对象反射

    Python之面向对象反射 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 ...

  2. day26.面向对象-反射封装内置方法

    封装 隐藏对象的属性和实现细节,近对外提供公共访问方式 广义:代码保护,面向对象思想 狭义:将属性,方法隐藏起来 class Person: __key = 123456 # 私有的静态属性 def ...

  3. python -- 面向对象 - 反射

    1.isinstance ,type, issubclass       isinstance:判断给的对象是否是**类型       type:返回**对象的数据类型       issubclas ...

  4. 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__

    反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...

  5. Python之面向对象-反射

    一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  6. python全栈开发从入门到放弃之面向对象反射

    1.classmethod.staticmethod方法 classmethod类方法默认参数cls,可以直接用类名调用,可以与类属性交互 #student文件内容 宝宝,男 博博,女 海娇,男 海燕 ...

  7. day7_subprocess模块和面向对象,反射

    常用subprocess方法示例 #执行命令,返回命令执行状态 , 0 or 非0>>> retcode = subprocess.call(["ls", &qu ...

  8. Day8 面向对象反射 item方法 打印对象信息__str__ 构析方法__del__ 程序的异常处理

    反射:通过字符串来访问到所对应的值(反射到真实的属性上). eg: class Foo: x=1 def __init__(self,name): self.name=name def f1(self ...

  9. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

随机推荐

  1. zabbix3.4.7版本饼图显示问题

    问题描述 最近使用zabbix3.4.7版本,发现监控Linux的主机关联系统自带的Template OS Linux模版之后,磁盘空间饼图显示有问题,出现空白,如图所示 查看之后,确定为自带的Lem ...

  2. Linux第六周作业

    一 实验过程 1 先进入LinuxKernel环境下,更新menu代码到最新版,用到的命令为rm menu -rf //强制删除当前menu,git clone http://git.shiyanlo ...

  3. Standalone的更改方式

    1.更改Game视图中的Standalone分辨率 2.在unity中菜单栏中 File---->Build Settings(Ctrl+Shift+B)---->Player Setti ...

  4. bzoj1294

    题解: 首先发现假如一个豆豆被多边形围住了,那么从这个豆豆引出一条射线 会有奇数个焦点 然后我们从每个豆豆引出一条射线 然后状压dfs 代码: #include<bits/stdc++.h> ...

  5. 2.BIND服务基础及域主服务器配置

    一.BIND 现今使用最晚广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早由伯克利大学的一名学生编写,现在最新的版本是9,由ISC(Internet ...

  6. mysql 内置函数和sql server 内置函数的区别

    以下函数均没有对参数做说明,使用的使用需要了解其参数内容 数据库 sql server mysql oracle 举例 获得当前系统时间 getdate() now() sysdate  注意不是函数 ...

  7. Mac 无需网线创建ipv6环境

    首先需要准备Mac一台 iPhone 2部(其中一部用于测试你的项目,请装上你的应用) 连接线一根 第一步:通过数据线连接iphone和mac 第二步:打开iphone的个人热点并选择仅USB 如果没 ...

  8. core1.1 升级到 2.0

    1.直接修改项目 1.1 改成 2.0 Startup 的修改 去除构造函数中下面的代码 var builder = new ConfigurationBuilder() .SetBasePath(e ...

  9. loadrunner json参数化

    因为json格式有{},所以LR参数化时如果也用默认的{}的话,会冲突,这样脚本运行时就无法识别,导致不能正确的读取参数化文件里的内容,此时把参数化的{}改成其他符号即可,比如<>

  10. Docker Kubernetes(K8s)简介

    入职了新公司,使用了Docker和K8s,需要有一个基础的了解,对网络上相关信息进行了简单总结. 一Docker 1简介: Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就 ...