反射:
反射的作用: 当你希望通过字符串---> 程序的变量名(类名函数名变量名方法名对象名) 你就可以考虑反射 某个命名空间中的某个"变量名",获取这个变量名对应的值
反射的四个内置函数:
hasattr
getattr
setattr
delattr
反射:
反射类
class Person:
role = '人类'
@staticmethod
def show_courses():
print('所有课程')
Person.role == getattr(Person,'role')
Person.show_courses() == getattr(Person,'show_courses')()
ret = getattr(Person,'show_courses')
ret()
反射对象
class A:
def __init__(self,name):
self.name = name
def eat(self):
print('%s is eating'%self.name)
cat = A('小熊')
if hasattr(cat,'name'): #hasattr 判断'name' 是否存在 存在返回True
print(getattr(cat,'name'))
if hasattr(cat,'eat'):
print(getattr(cat,'eat'))
getattr(cat,'eat')()
反射模块
import time
print(time.time()) #'time'
print(getattr(time,'time')())
反射文件
具体的例子:
from sys import modules
a = 1
b = 2
lst = [1,2,3]
class Manager:pass
class Student:pass
class Teacher:pass
getattr(modules[__name__],'Student')
identify = input('>>>').strip()
ret = getattr(modules[__name__],identify)
print(ret)
三个常用的装饰器方法:
@classmethod
用这个装饰器装饰一个类,那么这个类就变成类方法
特点:不使用对象的属性,但是使用类的属性
@staticmethod
用这个装饰器来装饰的方法就变成静态方法
特点:既不使用类的方法 也不使用对象的方法
@property
这个装饰器可以把一个方法伪装成一个属性
内置方法:
__new__ 构造方法,在对象实例化的时候执行这个方法,为对象创建一个空间,
__init__ 初始化方法 在对象实例化的时候执行这个方法 但是在__new__方法之后执行
__call__ 这个内置方法,在对象名加括号() 的时候执行
__str__ 这个方法可以让一个对象显示更清晰,返回一个字符串,
__repr__ 和str方法一样,
__del__ 在对象删除前,做收尾工作
__len__
__eq__ ==
item系列 对象[参数
单例模式:
class Teacher:
flag = None
def __new__(cls, *args, **kwargs):
if cls.flag is None:
cls.flag = object.__new__(cls) # 这一句话只能走一次
return cls.flag
def __init__(self,name):
self.name = name
面向对象进阶的一些内置方法