类 反射
Posted ming-yuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类 反射相关的知识,希望对你有一定的参考价值。
# 对象 = 类名() # 过程: # 类名() 首先 会创造出一个对象,创建了一个self变量 # 调用init方法,类名括号里的参数会被这里接收 # 执行init方法 # 返回self # 对象能做的事: # 查看属性 # 调用方法 # __dict__ 对于对象的增删改查操作都可以通过字典的语法进行 # 类名能做的事: # 实例化 # 调用方法 : 只不过要自己传递self参数 # 调用类中的属性,也就是调用静态属性 # __dict__ 对于类中的名字只能看 不能操作 # @property # 不加括号就能调用方法,像调用属性一样 # 是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 # @classmethod # 类名.方法名()就可调用,像调用def定义的函数一样,不依赖类,# 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法 # @staticmethod # 类名.方法名()如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法 # @property # 变属性 def price(self): # 实际价格 = 原价 * 折扣 new_price = self.original_price * self.discount return new_price @price.setter # 设置属性 def price(self, value): self.original_price = value @price.deleter # 删除属性 def price(self): del self.original_price # obj.price # 获取商品价格 # obj.price = 200 # 修改商品原价 # del obj.price # 删除商品原价 # # 组合 :一个对象的属性值是另外一个类的对象 # print(AB_son.__bases__) # 查看继承的父类 # # 调用对象的所有的属性或方法,如果没有就到父类中找 # # # class Person(Animal): # # __key = 123 # 私有静态属性 # def __init__(self,name,aggr,hp,sex): # Animal.__init__(self,name,aggr,hp) # 方式1 # super().__init__(name,aggr,hp) # 方式二 只在新式类中有,python3中所有类都是新式类 # # super(类名,实例名).eat() # 类外调用父类的方法 # super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的 # 父类中没有的属性 在子类中出现 叫做派生属性 # 父类中没有的方法 在子类中出现 叫做派生方法 # 只要是子类的对象调用,子类中有的名字 一定用子类的,子类中没有才找父类的,如果父类也没有报错 # 如果父类 子类都有 用子类的 # 如果还想用父类的,单独调用父类的: # 父类名.方法名 需要自己传self参数 # super().方法名 不需要自己传self # 正常的代码中 单继承 === 减少了代码的重复 # 继承表达的是一种 子类是父类的关系 # # # 新式类中的继承顺序 : 广度优先 # 多继承找父类,先检测,如果后一个父类不能到达的地方就使用深度继承,一条路走到底,如果后一个也能到达就在此打住走另一条路,找到为止。 # print(类名.__mro__) # mro方法只在新式类中存在 # # 在属性和方法前加__ ,所有的私有的 都不能在类的外部使用 # # class Goods: # __discount = 0.8 # def __init__(self,name,price): # self.name = name # self.__price = price # @property # def price(self): # return self.__price * Goods.__discount # @classmethod # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象 # def change_discount(cls,new_discount): # 修改折扣 # cls.__discount = new_discount # apple = Goods(‘苹果‘,5) # print(apple.price) # Goods.change_discount(0.5) # Goods.change_discount(Goods) # print(apple.price) # 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法 # # # 如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法 # # 静态方法 没有默认的参数 就象函数一样 # # isinstance(obj,cls)检查是否obj是否是类 cls 的对象 # issubclass(sub, super)检查sub类是否是 super 类的派生类 # 反射对象中的属性和方法 # hasattr getattr setattr delattr # print(hasattr(obj,‘name‘)) # 检测是否含有某属性 # getattr(object, name, default=None): # n=getattr(obj,‘name‘) #获取属性 # 返回地址加括号调用 # # Get a named attribute from an object ,getattr(x, ‘y‘) is equivalent to x.y. # setattr(x, y, v): # setattr(obj,‘sb‘,True) # 设置属性 # # setattr(x, ‘y‘, v) is equivalent to "x.y = v" # delattr(x, y): # delattr(obj,‘show_name111‘) # 删除属性#不存在,则报错 # Deletes the named attribute from the given object.delattr(x, ‘y‘) is equivalent to ``del x.y‘‘ # class Foo(object): # 类也是对象 staticField = "old boy" def __init__(self): self.name = ‘wupeiqi‘ def func(self): return ‘func‘ @staticmethod def bar(): return ‘bar‘ print getattr(Foo, ‘staticField‘) print getattr(Foo, ‘func‘) print getattr(Foo, ‘bar‘) # # 改变对象的字符串显示__str__,__repr__ # 自定制格式化字符串__format__ # 析构方法,当对象在内存中被释放时,自动触发执行。__del__ # __new__ # 对象后面加括号,触发执行。__call__ # 对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() # __len__ # __hash__ # __eq__ # __getitem__,__setitem__,__delitem__
以上是关于类 反射的主要内容,如果未能解决你的问题,请参考以下文章