zoukankan      html  css  js  c++  java
  • python--区分函数和方法, 反射

    1.  isinstance,   type,   issubclass

    isinstance(): 判断你给的xxx对象是否是xxxxx类型的,只支持向上判断

    isinstance(object, classinfo)
    

    type():返回xxx对象的数据类型

    type(object)
    type(name, bases, dict)
    

    issubclass():判断xxx类是否是xxx的子类

    class Animal:
        def eat(self):
            print("刚睡醒吃点儿东西")
    
    class Cat(Animal):
        def play(self):
            print("猫喜欢玩儿")
    
    # isinstance
    c = Cat()
    print(isinstance(c, Cat)) # c是一只猫
    print(isinstance(c, Animal)) # 向上判断
    
    a = Animal()
    print(isinstance(a, Cat)) # 不能向下判断
    
    # type
    print(type(a)) # 返回 a的数据类型
    print(type([]))
    print(type(c)) # 精准的告诉你这个对象的数据类型
    
    #issubclass
    # 判断.xx类是否是xxxx类的子类
    print(issubclass(Cat, Animal))
    print(issubclass(Animal, Cat))
    
    # 应用
    def cul(a, b): # 此函数用来计算数字a和数字b的相加的结果
        # 判断传递进来的对象必须是数字. int float
        if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
            return a + b
        else:
            print("对不起. 您提供的数据无法进行计算")
    
    print(cul(a, c))
    

      

    2.区分方法(Method)和函数(Function)

    类:

      实例方法: 类型.方法 就是函数.  对象.方法 就是 方法

    低级版的判定:

    def func():
        print("我是函数")
    
    class Foo:
        def chi(self):
            print("我是吃")
    
    # print(func) # <function func at 0x0000000001D42E18>
    f = Foo()
    # f.chi()
    
    print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x0000000002894A90>>
    
    # 打印的结果中包含了function. 函数
    #                         method  .  方法

    类方法: 都是方法

    我们的类也是对象.
    这个对象: 属性就是类变量
             方法就是类方法
    class Person:
        def chi(self):
            print("我要吃鱼")
    
        @classmethod
        def he(cls):
            print("我是类方法")
    
        @staticmethod
        def pi():
            print("泥溪镇地皮")
    
    p = Person()
    Person.chi(1)  # 不符合面向对象的思维
    
    print(p.chi) # <bound method Person.chi of <__main__.Person object at 0x00000000028C4B70>>
    print(Person.chi) # <function Person.chi at 0x00000000028989D8>
    
    实例方法:
      1. 如果使用   对象.实例方法   方法
      2. 如果使用     类.实例方法     函数
    
    print(Person.he) # <bound method Person.he of <class '__main__.Person'>>
    print(p.he) # <bound method Person.he of <class '__main__.Person'>>
    
    类方法都是 方法
    print(Person.pi) # <function Person.pi at 0x0000000009E7F488>
    print(p.pi) # <function Person.pi at 0x0000000009E7F488>
    
    静态方法都是函数
    

     

    高级版的判定

    from types import FunctionType, MethodType # 方法和函数
    
    class Person:
        def chi(self): # 实例方法
            print("我要吃鱼")
    
        @classmethod
        def he(cls):
            print("我是类方法")
    
        @staticmethod
        def pi():
            print("静态方法")
    p = Person()
    
    print(isinstance(Person.chi, FunctionType)) # True
    print(isinstance(p.chi, MethodType)) # True
    
    print(isinstance(p.he, MethodType)) # True
    print(isinstance(Person.he, MethodType)) # True
    
    print(isinstance(p.pi, FunctionType)) # True
    print(isinstance(Person.pi, FunctionType)) # True
    

      

    3.反射

      程序可以访问,检测和修改它本身状态或行为的一中能力(自省)好处可以实现定义好忌口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种后期绑定

    一共用到四个函数

    attr: attitude 属性的意思

    getattr(obj,str)  从xxx对象中获取到xxx属性值

    getattr(object, name[, default])

    hasattr(obj,str) 判断xxx对象中是否有xxx属性值

    hasattr(object, name)

    delattr(obj,str) 从xxx对象中删除xxx属性

    delattr(object, name)

    setattr(obj,str,value)  设置xxx对象中的xxx属性为xxx值

    setattr(object, name, value)
    

    对于模块而言可以使用getattr, hasattr, 同样对于我们的对象也可以执行类似的操作

    class Person:
        def __init__(self, name, laopo):
            self.name = name
            self.laopo = laopo
    
    p = Person("宝宝", "林志玲")
    
    print(hasattr(p, "laopo")) #
    print(getattr(p, "laopo")) # p.laopo
    
    setattr(p, "laopo", "胡一菲") # p.laopo = 胡一菲
    setattr(p, "money", 100000000000) # p.money = 100000000
    
    print(p.laopo)
    print(p.money)
    
    delattr(p, "laopo") # 把对象中的xxx属性移除.  != p.laopo = None
    print(p.laopo)
    

      

  • 相关阅读:
    web前端的发展态势
    AngularJs 简单入门
    css代码优化篇
    git提交报错:Please make sure you have the correct access rights and the repository exists.
    Activiti工作流框架学习
    遍历map集合的4种方法
    js设置日期、月份增加减少
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    webservice_rest接口_学习笔记
    相互匹配两个list集合+动态匹配${}参数
  • 原文地址:https://www.cnblogs.com/robertx/p/10152539.html
Copyright © 2011-2022 走看看