今日内容:
1.属性
2. 类方法
3.静态方法
4.反射
1. 属性
是指调用类中的函数,就像调用对象属性值一样调用.更权威解释:将方法 伪装 成属性,虽然在代码层面上没有任何高深之处,但是让其看起来更合理.
示例:
class A: def __init__(self,*args): self.name = args[0] self.height = args[1] self.weight = args[2] @property def bmi(self): return self.height /self.weight**2 a1 = A("leon",1.72,60) print(a1.bmi)
注意,这里是通过加@property 这个装饰器来实现的,
即然是属性,那么也可以修改的,关于修改和删除,是通过下面方法实现的,
示例:
class B: def __init__(self,*args): self.name = args[0] self.__pwd = args[1] @property def pwd(self): return self.__pwd @pwd.setter #注意这里的装饰器名字和上面的函数名一致,以及下面的函数都是一致的,下面赋值会传入这个new_pwd里面 def pwd(self,new_pwd): self.__pwd = new_pwd obj1 = B("leon","hao123") obj1.pwd = 123456 print(obj1.pwd)
属性的删除操作示例:
class B: def __init__(self,*args): self.name = args[0] self.__pwd = args[1] @property def pwd(self): return self.__pwd @pwd.setter #注意这里的装饰器名字和上面的函数名一致,以及下面的函数都是一致的,下面赋值会传入这个new_pwd里面 def pwd(self,new_pwd): self.__pwd = new_pwd @pwd.deleter def pwd(self): del self.__pwd obj1 = B("leon","hao123") obj1.pwd = 123456 print(obj1.pwd) del obj1.pwd print(obj1.pwd)
具体操作流程如下:
# 第一步,对属性进行改操作,自动执行 被这个@pwd.setter装饰器装饰的方法
# 第二步,将新值传给这个被@pwd.setter装饰器装饰的方法里面,当做参数.
2. 类方法,静态方法
类方法:类名去调用类方法,自动将类的空间传给类方法中的cls..对象如果调用类方法,自动将类空间传给类中的cls
示例:
class C: num = 1 def __init__(self,*args): self.name = args[0] self.age = args[1] @classmethod def class_fun(cls): print(cls.num) c1 = C("leon",18) c1.class_fun()
什么情况下使用类方法?
直接让类去操作类中的方法,没有必要创建对象在操作的时候,用类方法.
3. 静态方法
静态方法:在类中定义一个静态方法,无需传入你的类空间,对象空间,可以当成普通函数去用.(也就是不用再传入self的,也就是类中的独立函数)
示例:
class D: def __init__(self): pass @staticmethod def fun(a,b): return a + b d1 = D() print(d1.fun(2,3))
4.反射(非常非常重要,)
反射:通过 字符串 操作一个空间 (对象).
总共有四个方法:
1.getattr()
2.hasattr()
3.setattr()
4.delattr()
四种场景的不同使用方法:
1,实例化一个对象去研究
示例:
class A: country = "China" def __init__(self,*args): self.name = args[0] self.age = args[1] def fun(self): print("666") a1 = A("leon",18) getattr(a1,"fun")() print(hasattr(a1,"name1")) # getattr(a1,"name1") setattr(a1,"sex","男") print(getattr(a1,"sex")) delattr(a1,"name") print(hasattr(a1,"name"))
2.类中去研究.
class A: num = 1 def __init__(self,*args): self.name = args[0] self.age = args[1] def fun(self): print("IN A") print(getattr(A,"num")) print(setattr(A,"num1",3)) print(hasattr(A,"num1")) delattr(A,"num1") print(hasattr(A,"num1"))
3,其他模块去研究.
oldboy.py """ class B: name_list = ['张三','旭哥','李四','旭哥'] @staticmethod def add(a,b):return a+b def login(username,password): if username == 'alex' and password == '123': print('登录成功') else: print('登录失败') """ import oldboy print(getattr(oldboy.B,"name_list")) print(hasattr(oldboy,"login")) setattr(oldboy,"name",1) print(hasattr(oldboy,"name")) print(getattr(oldboy,"name"))
4.本模块(本文件)去研究.
示例:
import sys def login(): print("登录") def fun(): print("333") content = input(">>>") getattr(sys.modules[__name__],content)()