- 一、动态语言
- 1.python 为动态语言 定义:它是一类 在运行时可以改变其结构的语言 :例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力
- 2.动态语言:可以在运行的过程中,修改代码
- 静态语言:编译时已经确定好代码,运行过程中不能修改
- 3.运行中动态改变代码:
- 1.动态赋值
- a=10 后面可以修改 a=False 等
- 2.实例对象动态添加属性
- a=类() a.name="张三"
- 3.实例对象动态添加方法
- def test():
- pass
- a.test=test
- a.test()
- def test():
- 4.添加方法其他方式
- import types
- def test(self):
- print(self.name)
- a.test=types.MethodType(test,a) -->可以把对象传入到添加方法中的self参数中,调用时无需加self参数
- a.test()
- 5.动态添加类的静态方法和类方法
- @classmethod
- def test1(cls):
- print("类方法")
- 类.test1=test1
- @staticmethod
- def test2():
- print("静态方法")
- 类.test2=test2
- 6.动态删除属性和方法
- del 实例对象(类).属性名 删除类或实例对象属性
- delattr(对象或类,"属性") 删除类或实例对象属性
- del 实例对象.方法 delattr(实例对象,"方法") 只能删除类外动态添加的方法,也不能删除类方法和静态方法
- 7.在类中使用__slots__变量 限制添加实例对象属性和方法
- class Test:
- __slots__=("属性方法1","属性方法2"...)
- 那么在类外实例对象,和类中将不能添加 __slots__变量外的属性方法
- 1.动态赋值
- 二、元类
- 1.类就是一组用来描述如何生成一个对象的代码段。
- 2.类同样也是一种对象,也就是类对象
- 3.元类就是创建类这种对象的东西。type就是Python的内建元类
- 4.Python中所有的东西,注意,我是指所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。
- 5.使用type(元类)创建类
- 1.格式:type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
- 2.创建有类属性的类
- 类名=type("类名",(object,),{"name:"张山"}) 添加的属性是类属性,并不是实例属性。
- 3.使用type创建带有方法的类
- def eat(self):
- print("吃")
- 类名=type("类名",(object,),{"name:"张山"},"eat":eat)
- def eat(self):
- 4.添加类方法,实例方法
- @classmethod
- def test1(cls):
- print("类方法")
- @staticmethod
- def test2():
- print("静态方法")
- 类名=type("类名",(object,),{"test1":test1,"test2":test2})
- 5.自定义元类
- metaclass采用这种方法,这个模块中的所有类都会通过这个元类来创建
- class UpperAttrMetaClass(type):
- def __new__(cls, future_class_name, future_class_parents, future_class_attr):
- # 遍历属性字典,把不是__开头的属性名字变为大写
- newAttr = {}
- for name, value in future_class_attr.items():
- if not name.startswith("__"):
- newAttr[name.upper()] = value
- if not name.startswith("__"):
- # 方法1:通过'type'来做类对象的创建
- # return type(future_class_name, future_class_parents, newAttr)
- # 方法2:复用type.__new__方法
- # 这就是基本的OOP编程,没什么魔法
- # return type.__new__(cls, future_class_name, future_class_parents, newAttr)
- # 方法3:使用super方法
- return super(UpperAttrMetaClass, cls).__new__(cls, future_class_name, future_class_parents, newAttr)
- class Foo(object, metaclass=UpperAttrMetaClass):
- bar = 'bip'
- #判断对象有没有这个属性或方法 hasattr(对象,"属性方法")
- print(hasattr(Foo,"bar")) -->False
- print(hasattr(Foo,"BAR")) -->True 自定义元类把属性改为大写了
- 三、拓展
- 1.内建属性
- __init__,__str__,__call__,__del__,__bases__,__new__
- __dict__ 查看实例属性,__doc__ 查看类的文档,子类不继承,__repf__ 类实例 回车 或者 print(repr(类实例))
- __class__ 查看对象是由什么创建的 如类由元类创建 实例对象由类创建 整数由 int 创建
- __getattribute__ 属性拦截器
- class test(object):s
- def __init__(self):
- self.name = "张三"
- self.age = 18
- #属性访问时拦截器
- def __getattribute__(self,obj):
- if obj == "age":
- print("访问age属性被拦截")
- return 2
- else:
- return object.__getattribute__(self,obj)
- if obj == "age":
- def show(self):
- print(self.name,self,age)
- s = test()
- print(s.name) -->张三
- print(s.age) 被拦截--> 2
- print(s.show) -->张三 2
- 2.工具函数模块
- 1.import functools
- func(*args,**kwargs):
- pass
- new_func=functools.partical(fun,1,2,3,name="张三") --》给函数设置默认参数,返回新函数,旧函数不变
- func(*args,**kwargs):
- 2.使用装饰器时,被装饰后的函数其实已经是另外一个函数了。由于函数的doc发生了改变,对测试结果有一些影响
- 比如 test.__doc__ 拿到的不再是自己的帮助文档,而是内嵌函数的帮助文档
- import functools 在装饰器内嵌函数上添加@functools.wraps(func)
- test.__doc__ 拿到的是自己的帮助文档,
- 1.import functools
- 1.内建属性
python----元类
猜你喜欢
转载自blog.csdn.net/xiaochendefendoushi/article/details/81140931
今日推荐
周排行