小学生绞尽脑汁也学不会的python(反射)

1. issubclass, type, isinstance
issubclass 判断xxxx类是否是xxxx类的子类
type 给出xxx的数据类型. 给出创建这个对象的类
isinstance 判断xxx对象是否是xxx类型的

class Animal:
pass class Cat(Animal):
pass class BoSiCat(Cat):
pass print(issubclass(Cat, Animal)) # 判断第一个参数是否是第二个参数的后代
print(issubclass(Animal, Cat))
print(issubclass(BoSiCat, Animal)) # True

 

# class Animal:
# pass
#
# class Cat(Animal):
# pass
#
# class BoSiCat(Cat):
# pass
#
# c = Cat()
# print(type(c)) # 比较精准的给出对象的类 # 计算a+b的结果并返回. 两个数相加
# 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("算不了")
#
# print(add("胡汉三", 2.5))

  

class 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家族体系的内容. 往上找 lst = "马化腾"
print(type(lst.__iter__()))

  

 

2. 如何分辨方法和函数.
在外面定义的函数一定是函数
在类中:
1. 实例方法: 如果是对象访问.方法,, 如果是类名访问是函数
2. 静态方法: 都是函数
3. 类方法: 都是方法
如果想要用程序来判断. 需要引入两个模块
from types import FunctionType, MethodType
isinstance()

def func():
print("我是func") print(func) # <function func at 0x00000253260678C8> class Foo:
# 实例方法: 对象.方法 方法 类名.方法 函数
def chi(self):
print("我是吃") @staticmethod # 都是函数
def static_method():
pass @classmethod # 都是方法
def class_method(cls): # 类对象的内容
pass
@property # 神马都不是. 变量
def age(self):
return 10 # 引入两个模块
from types import FunctionType, MethodType def haha(arg):
print(isinstance(arg, FunctionType)) # False
print(isinstance(arg, MethodType)) # True
haha(Foo.age) # f = Foo()
# print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x0000022D69C48390>>
# Foo.chi(f)
# print(Foo.chi) # <function Foo.chi at 0x000001A4BBEE79D8>
#
# print(f.static_method) # <function Foo.static_method at 0x000002BBD2DB7A60>
# print(Foo.static_method) # <function Foo.static_method at 0x00000233E2247A60>
#
# 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'>>

  

3. 反射(重点)
仅限于内存层面
重点:
hasattr(obj, str) 判断对象中是否包含了xxx(str)
getattr(obj, str) 从对象中获取xxxx(str)
次重点:
setattr(obj, str, value) 给对象设置xxxx(str)属性值(value)
delattr(obj, str) 从对象中删除xxxxx(str)信息

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", 18) # 很少用. 慎用 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()

  

最新文章

  1. CC2640-之功耗
  2. Centos学习手册——装逼宝典之强制重置密码
  3. Asp.Net EF Code First 简单入门
  4. Submission Details
  5. 超链接解决头部fixed问题
  6. Asp.Net Core MailKit 完美附件(中文名、长文件名)
  7. mybatis将传入的Integer类型的0被识别成空字符串的问题
  8. webpack始出来
  9. Vue + Element UI 实现权限管理系统 前端篇(十一):第三方图标库
  10. (转)C# WebApi 接口参数不再困惑:传参详解
  11. NPOI 操作笔记
  12. 【OpenCV3】直线拟合--FitLine()函数详解
  13. MongoDB的高级使用
  14. 20155220 实验一《Java开发环境的熟悉》实验报告
  15. vim 单文件中查找方法
  16. 运行hadoop自带的wordcount例子程序
  17. centos 中没有 ifcfg-eth0 配置文件的解决办法
  18. JavaScript:学习笔记(2)——基本概念与数据类型
  19. 腾讯云负载均衡CLB
  20. Kali Linux Wine32英文字体不显示问题

热门文章

  1. 在eclipse中maven构建Web项目,tomcat插件在maven中的运用
  2. php 返回某个月的 每周几有几天
  3. 00070_Calendar
  4. 【CodeForces 987C】Three displays
  5. Java开源框架 iBase4J 搭建笔记
  6. [Linux]第四部分-Linux用户管理
  7. NEFU 117
  8. Unity3D_c#脚本注意要点
  9. 网络抓包工具 Fiddler
  10. 关于server和虚拟主机的差别