一丶,isinstance/issubclass/type

  1.issubclass检查第一个参数是否是第二个参数的 子子孙孙类

  1. class Foo():
  2. pass
  3. class Boo(Foo):
  4. pass
  5. class Aoo(Boo):
  6. pass
  7. print(issubclass(Boo,Foo)) #True
  8. print(issubclass(Aoo,Foo)) #True

  2.type获取当前对象是由那个类创建。

  1. class Foo(object):
  2. pass
  3.  
  4. obj = Foo()
  5.  
  6. print(obj,type(obj)) #<__main__.Foo object at 0x000001B58F579D68> <class '__main__.Foo'>
  7. if type(obj) == Foo:
  8. print('obj是Foo类型') #obj是Foo类型

  type练习

  1. class Foo(object):
  2. pass
  3.  
  4. class Bar(object):
  5. pass
  6.  
  7. def func(*args):
  8. foo_counter =0
  9. bar_counter =0
  10. for item in args:
  11. if type(item) == Foo:
  12. foo_counter += 1
  13. elif type(item) == Bar:
  14. bar_counter += 1
  15. return foo_counter,bar_counter
  16.  
  17. result = func(Foo(),Bar(),Foo())
  18. print(result) #(2, 1)
  19.  
  20. v1,v2 = func(Foo(),Bar(),Foo())
  21. print(v1,v2) #2 1

type练习

  3.isinstance,检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

  1. class Base(object):
  2. pass
  3.  
  4. class Foo(Base):
  5. pass
  6.  
  7. obj1 = Foo()
  8. print(isinstance(obj1,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
  9. print(isinstance(obj1,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
  10.  
  11. obj2 = Base()
  12. print(isinstance(obj2,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
  13. print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

 

二丶方法和函数

  称谓:

    类,方法

    外,函数

  到底什么是方法,什么是函数?

    对象.xxx  --->  xxx就是方法

    类.xxx    ---> xxx就是函数

    xxx  --->  xxx就是函数

  打印查看:

    function

    method

代码演示:

  1. from types import MethodType,FunctionType
  2. class Foo:
  3. def display(self):
  4. pass
  5. def check(arg):
  6. """
  7. 检查arg是方法还是函数?
  8. :param arg:
  9. :return:
  10. """
  11. if isinstance(arg,MethodType):
  12. print('arg是一个方法')
  13. elif isinstance(arg,FunctionType):
  14. print('arg是一个函数')
  15.  
  16. else:
  17. print('不知道是什么')
  18. check(check) #arg是一个函数
  19. obj = Foo()
  20. check(obj.display) #arg是一个方法

三丶反射

  1.getattr : 根据字符串的形式,去对象中找成员

  1. class Foo(object):
  2.  
  3. country = "中国"
  4.  
  5. def func(self):
  6. pass
  7. v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。
  8. print(v) #<function Foo.func at 0x000001E1A557D8C8>
  9.  
  10. obj = Foo()
  11. v = getattr(obj,"func") # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。
  12. print(v) #<bound method Foo.func of <__main__.Foo object at 0x000001E1A5579F28>>

  2.hasattr : 根据字符串的形式,去判断对象中是否有成员.

  1. a = 123
  2. class Foo(object):
  3. country = "中国"
  4. def func(self):
  5. pass
  6. v2 = hasattr(Foo,"a") #判断Foo中是否有a成员
  7. v3 = hasattr(Foo,'country') #判断Foo中是否有country成员
  8. v4 = hasattr(Foo,"func") #判断Foo中是否有func成员
  9. v5 = hasattr(Foo,'xxxxxxx')
  10.  
  11. print(v2,v3,v4,v5) # False True True False

  3.setattr : 根据字符串的形式,动态的设置一个成员(内存)

  1. # 根据字符串的形式,动态的设置一个成员(内存)
  2. x1 = 123
  3. class Foo:
  4. def f1(arg):
  5. print(arg,666)
  6.  
  7. setattr(Foo,'x2',999)
  8. v1 = getattr(Foo,'x2')
  9. print(v1) #

  4.根据字符串的形式,动态的删除一个成员(内存)

  1. x1 = 123
  2. class Foo:
  3. def f1(arg):
  4. print(arg,666)
  5. delattr(Foo,'x1')
  6. v9 = getattr(Foo,'x1')
  7. print(v9)

  应用

  1. class Account(object):
  2. func_list = ['login', 'logout', 'register']
  3.  
  4. def login(self):
  5. """
  6. 登录
  7. :return:
  8. """
  9. print('登录111')
  10.  
  11. def logout(self):
  12. """
  13. 注销
  14. :return:
  15. """
  16. print('注销111')
  17.  
  18. def register(self):
  19. """
  20. 注册
  21. :return:
  22. """
  23. print('注册111')
  24.  
  25. def run(self):
  26. """
  27. 主代码
  28. :return:
  29. """
  30. print("""
  31. 请输入要执行的功能:
  32. 1. 登录
  33. 2. 注销
  34. 3. 注册
  35. """)
  36.  
  37. choice = int(input('请输入要执行的序号:'))
  38. func_name = Account.func_list[choice-1]
  39. func = getattr(self, func_name) # self.login
  40. func()
  41.  
  42. obj1 = Account()
  43. obj1.run()
  44.  
  45. obj2 = Account()
  46. obj2.run()

应用

四丶callable 判断是否可以调用

  1. def func():
  2. pass
  3.  
  4. class Foo(object):
  5. def __call__(self, *args, **kwargs):
  6. pass
  7. def func(self):
  8. pass
  9. obj = Foo()
  10.  
  11. print(callable(func))
  12. print(callable(Foo))
  13. print(callable(obj))
  14. print(callable(obj.func))

方法和函数,isinstance/issubclass/type以及反射的更多相关文章

  1. 面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射

    一.面向对象中特殊方法的补充 1.__str__ 能将对象名改成你想要的字符串,但是类型还是类 class Foo(object): def __init__(self): pass def func ...

  2. isinstance/issubclass/type的区别?

    type() 判断某个对象是否是该类创建的,只看一层,如果是继承类,也不会考虑继承类的类型.. Issubclass() 判断该类是否是另一个类的派生类,也就是子类,参数为类. isinstance( ...

  3. 反射 方法和函数 type

    1. isinstance/issubclass/type  *** issubclass 判断xxx类是否是xxx类的子类 class Animal: pass class Cat(Animal): ...

  4. day 25 方法和函数 反射

    特殊成员的补充: # __str__ class Foo(object): def __init__(self): pass def func(self): pass def __str__(self ...

  5. Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass

    Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...

  6. python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass

    https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...

  7. issubclass/type/isinstance、函数和方法、反射、callable、特殊成员补充

    一.issubclass/type/isinstance(***) 1.issubclass(参数1, 参数2):检查第一个参数是否是第二个参数的 子子孙孙类,如下示例: class Base(obj ...

  8. python isinstance和issubclass,区分方法和函数,反射

    一.isinstance和issubclass 1.isinstance class Animal: def eat(self): print('刚睡醒吃点儿东西') class Cat(Animal ...

  9. python之反射机制与callattr()、issubclass()、isinstance、type()相关

    一.反射机制 * 反射可以理解为 通过字符串的形式,动态导入模块: 利用字符串的形式,在对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动! 反射机制的内置函数 # hasa ...

随机推荐

  1. Socket对象以及异常

    1  socket构造器: public Socket() 创建一个Socket套接字 public Socket(InetAddress address,int port) 创建一个指定IP和端口的 ...

  2. AngularJS(Part 10)--页面导航

    页面导航     过去,一个URL代表一个页面.但是随着Ajax的兴起,情况发生的很大的变化.不同的内容可以使用同一个URL.这让浏览器中的回退.前进甚至收藏按钮都失去了作用.而AngularJS提供 ...

  3. 在PCL中如何实现点云压缩(2)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=125 压缩配置文件: 压缩配置文件为PCL点云编码器定义了参数集.并针对压缩 ...

  4. window 删除文件提示指定的文件名无效或太长

    方法0: 使用 chkdsk 磁盘修复工具 .单击“开始”,点击“运行”,输入cmd并回车打开命令提示符窗口: .在此窗口输入以下命令: 例如:检查并修复D分区 chkdsk D: /f 回车,输入 ...

  5. 剑指offer(65):获取数据流中的中位数

    参考 https://blog.csdn.net/u011080472/article/details/51291089 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位 ...

  6. Entity Framework Code-First(5):Code First Conventions

    Code First Conventions: We have seen how EF Code-First creates DB tables from domain classes in the ...

  7. 【lunux-make: *** 没有规则可以创建目标“install”。 停止。问题】

    [root@localhost nginx-1.8.0]# make installmake: *** 没有规则可以创建目标“install”. 停止.

  8. 清北刷题冲刺 11-02 a.m

    卖书 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  9. vue-cli 使用sass(scss)

    安装依赖: npm install sass-loader node-sass vue-style-loader --save-dev

  10. php与MySQL与echart综合使用

    http://www.yinghualuowu.com/php/echart.html 创建table sex 有name num             <?php ini_set('disp ...