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()