Python-类的其他成员、反射
类的其他成员
实例方法:
依赖对象,不需要装饰器装饰,方法的参数是self
类方法:
@classmethod:依赖类,被classmethod装饰器装饰的方法,参数是cls
class A: def func(self): # 实例方法 print("is A func")a = A() # 实例化一个对象(实例)A.func(12) # 类调用需要添加一个参数a.func() # 对象调用不需要传参?class A(object): @classmethod def func(cls): print(cls) # 类的地址 print(‘is A func‘) obj = cls() print(obj)print(A)A.func() # 此时类调用类里面的方法时不用传实参??类方法可以自动变换类名(最大的作用)1.使用类方法可以获取到类地址进行实例化2.可以通过类名修改类属性类方法偶尔会使用,使用最多的还是实例化方法?
静态方法:
@staticmethod:不依赖类和对象 就是一个普通的函数
import timeclass TimeTest(object): def __init__(self,hour,minute,second): self.hour = hour self.minute = minute self.second = second @staticmethod def showTime(): return time.strftime("%H:%M:%S",time.localtime())print(TimeTest.showTime())t = TimeTest(2,10,10)nowTime = t.showTime()print(nowTime)只使用了静态方法(函数),然而方法体中并没有使用(也不能使用)类或实例的属性(或方法)
属性:
@propertydef bmi(): [email protected]@[email protected]
元类
python大部分自带的类和自己定义的类都是由type类实例出来的
type 查看数据类(能够查看出当前内容从属于哪个类)
python中一切皆对象
issubclass() 判断参数1是不是参数2的子类
isinstance() 判断参数1是不是参数2的对象
object和type的关系:
object是type的对象
print(isinstance(object,type))
type是object的子类
print(issubclass(type,object))
反射
通过字符串操作对象的属性和方法
1.对象的角度使用反射
class A: def __init__(self,name): self.name = name def func(self): print("is func")a = A("laoda")print(hasattr(a,"name")) # 返回bool值True就说明name这个属性在对象中存在print(getattr(a,"name")) # laodaf = getattr(a,"func")f()print(getattr(a,"age",None)) # 没有这个属性就返回Nonegetattr获取的是类中的方法时,获取的是函数地址,获取静态属性时获取的是本身
2.类的角度使用反射
class A: def __init__(self,name): self.name = name def func(self): print("is func")a = A("laoda")print(hasattr(A,"name")) # Falsef = getattr(A,"func")f(11) # 类调用函数要加参数,而对象调用不用加setattr(A,"age",18)print(A.__dict__)
3.当前模块使用反射
def foo(): print("is foo")f = globals()["foo"]f()?import syso = sys.modules[__name__] # 获取当前模块名对应的对象f = getattr(o,"foo")f()
4.其他模块使用反射
import testo = globals()["test"]f = getattr(o,"func")f()
模块部分使用反射的方式:
方法一:
import syssys.modules[__name__]
方法二:
globals()[__name__]
hasattr(对象,字符串)
getattr(对象,字符串,查找不到的返回值)
setattr(对象,字符串,值)
delattr(对象,字符串)
反射的应用
if hasattr():
getattr()