Python-类的其他成员反射

Posted we我们

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 time
class 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)
只使用了静态方法(函数),然而方法体中并没有使用(也不能使用)类或实例的属性(或方法)

属性:

@property
def bmi():
   pass
@bmi.setter
@bmi.getter
@bmi.deleter

元类

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")) # laoda
f = getattr(a,"func")
f()
print(getattr(a,"age",None)) # 没有这个属性就返回None
getattr获取的是类中的方法时,获取的是函数地址,获取静态属性时获取的是本身

2.类的角度使用反射

class A:
   def __init__(self,name)
  self.name = name
   def func(self):
       print("is func")
a = A("laoda")
print(hasattr(A,"name")) # False
f = getattr(A,"func")
f(11)   # 类调用函数要加参数,而对象调用不用加
setattr(A,"age",18)
print(A.__dict__)

3.当前模块使用反射

def foo():
   print("is foo")
f = globals()["foo"]
f()
?
import sys
o = sys.modules[__name__]  # 获取当前模块名对应的对象
f = getattr(o,"foo")
f()

4.其他模块使用反射

import test
o = globals()["test"]
f = getattr(o,"func")
f()

模块部分使用反射的方式:

  • 方法一:

import sys
sys.modules[__name__]
  • 方法二:

globals()[__name__]

hasattr(对象,字符串)

getattr(对象,字符串,查找不到的返回值)

setattr(对象,字符串,值)

delattr(对象,字符串)

 反射的应用

if hasattr():

getattr()

以上是关于Python-类的其他成员反射的主要内容,如果未能解决你的问题,请参考以下文章

java_反射

面向对象

java反射--获取成员变量信息

JavaEE之反射

牛逼!不得不服,第一次有人把Java 反射机制讲解这么透!

Python----面向对象异常处理反射单例模式