Python高级
动态语言
动态语言:python 运行期间
静态语言:
C
java
编译 源文件 ---》 产生文件 ----》运行
1.编译 源文件
源代码
2.字节码
3.字节码送到解释器运行
动态添加
动态添加方法
person.eat = eat
print(dir(person))
调用添加的方法
person.eat()
添加方法: 有参数的
1.不引用类中的内容 person.play = play
2. 如果要使用类中的内容 play(self, game)
person.play = play
person.play(person, "第五人格")
添加方法其他方式
types.MethodType(方法名, 实例对象)
1.添加实例属性: 对象名.属性名=值
2.添加实例方法: 对象名.方法名()
方式1: 对象名.方法(属性名)=函数名
方式2: import types 对象.方法(属性名)= types.MethodType(函数名,实例对象)
动态添加 类方法
@classmethod
def eat(cls):
print("后添加的类方法。。。。。", cls.name)
@classmethod
def play(cls, game):
print("后添加的类方法play。。。。。", game)
Person.eat = eat
Person.play = play
print(dir(Person))
# person1 person2
person1.show()
person1.eat()
person1.play("英雄联盟")
Person.play("绝地求生")
添加静态方法
@staticmethod
def sleep():
print(Person.name, "------->sleep")
Person.sleep = sleep
print(dir(Person))
Person.sleep()
person1.sleep()
删除属性
删除方法
注意: 类本身存在的不能删除,动态添加的就可以通过
1. del 对象.属性
delattr(person, "show")
print(dir(person))
2. delattr(对象,"属性")
import types
person.show = types.MethodType(show, person)
print(dir(person))
delattr(person, "show") 删除方法 报错
__slots__
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
只能限制实例的属性或者方法,但是无法限制类属性,类方法,静态方法
元类
系统数据类型: int str list tuple dict 。。。
自定义类型: Person Student Teacher
Person 也是一个对象 ----》type
import types
type.MethodType(..,..) ---->类对象,实例对象已经存在
type("类名",父类元组,属性字典)
关于元类真的没有别的可说的了。但就元类本身而言,它们其实是很简单的:
1. 拦截类的创建
2. 修改类
3. 返回修改之后的类
案例
class UpperAttrMetaClass(type):
# __new__ 是在__init__之前被调用的特殊方法
# __new__是用来创建对象并返回之的方法
# 而__init__只是用来将传入的参数初始化给对象
# 你很少用到__new__,除非你希望能够控制对象的创建
# 这里,创建的对象是类,我们希望能够自定义它,所以我们这里改写__new__
# 如果你希望的话,你也可以在__init__中做些事情
# 还有一些高级的用法会涉及到改写__call__特殊方法,但是我们这里不用
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
# 方法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)
# python2的用法
class Foo(object, metaclass=UpperAttrMetaClass):
bar = 'bip'
print(hasattr(Foo,"BAR"))
内建属性
print(Test.__class__) # 实例所在的类
print(Test.__dict__) # 实例自定义属性
print(Test.__doc__) # 类文档,子类不继承
print(Test.__bases__) # 查看所有父类
print(t.__repr__())
repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思。如list,dict使用str()是无效的,但使用repr可以,这是为了看它们都有哪些值,为了显示之用。
__getattrbute__
属性拦截
partial函数(偏函数) 设置默认值的
functools.partial(函数,默认值)
@functools.wraps(func) # 添加的目的说就是引用原函数的文档
dir(__builtins__) 在终端可以执行
垃圾回收
整数有对象池:
1.小整数
2.大整数 不同的解释器就会有不同的结果
cpython
ipython
区别
动态语言
动态语言:python 运行期间
静态语言:
C
java
编译 源文件 ---》 产生文件 ----》运行
1.编译 源文件
源代码
2.字节码
3.字节码送到解释器运行
动态添加
动态添加方法
person.eat = eat
print(dir(person))
调用添加的方法
person.eat()
添加方法: 有参数的
1.不引用类中的内容 person.play = play
2. 如果要使用类中的内容 play(self, game)
person.play = play
person.play(person, "第五人格")
添加方法其他方式
types.MethodType(方法名, 实例对象)
1.添加实例属性: 对象名.属性名=值
2.添加实例方法: 对象名.方法名()
方式1: 对象名.方法(属性名)=函数名
方式2: import types 对象.方法(属性名)= types.MethodType(函数名,实例对象)
动态添加 类方法
@classmethod
def eat(cls):
print("后添加的类方法。。。。。", cls.name)
@classmethod
def play(cls, game):
print("后添加的类方法play。。。。。", game)
Person.eat = eat
Person.play = play
print(dir(Person))
# person1 person2
person1.show()
person1.eat()
person1.play("英雄联盟")
Person.play("绝地求生")
添加静态方法
@staticmethod
def sleep():
print(Person.name, "------->sleep")
Person.sleep = sleep
print(dir(Person))
Person.sleep()
person1.sleep()
删除属性
删除方法
注意: 类本身存在的不能删除,动态添加的就可以通过
1. del 对象.属性
delattr(person, "show")
print(dir(person))
2. delattr(对象,"属性")
import types
person.show = types.MethodType(show, person)
print(dir(person))
delattr(person, "show") 删除方法 报错
__slots__
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
只能限制实例的属性或者方法,但是无法限制类属性,类方法,静态方法
元类
系统数据类型: int str list tuple dict 。。。
自定义类型: Person Student Teacher
Person 也是一个对象 ----》type
import types
type.MethodType(..,..) ---->类对象,实例对象已经存在
type("类名",父类元组,属性字典)
关于元类真的没有别的可说的了。但就元类本身而言,它们其实是很简单的:
1. 拦截类的创建
2. 修改类
3. 返回修改之后的类
案例
class UpperAttrMetaClass(type):
# __new__ 是在__init__之前被调用的特殊方法
# __new__是用来创建对象并返回之的方法
# 而__init__只是用来将传入的参数初始化给对象
# 你很少用到__new__,除非你希望能够控制对象的创建
# 这里,创建的对象是类,我们希望能够自定义它,所以我们这里改写__new__
# 如果你希望的话,你也可以在__init__中做些事情
# 还有一些高级的用法会涉及到改写__call__特殊方法,但是我们这里不用
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
# 方法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)
# python2的用法
class Foo(object, metaclass=UpperAttrMetaClass):
bar = 'bip'
print(hasattr(Foo,"BAR"))
内建属性
print(Test.__class__) # 实例所在的类
print(Test.__dict__) # 实例自定义属性
print(Test.__doc__) # 类文档,子类不继承
print(Test.__bases__) # 查看所有父类
print(t.__repr__())
repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思。如list,dict使用str()是无效的,但使用repr可以,这是为了看它们都有哪些值,为了显示之用。
__getattrbute__
属性拦截
partial函数(偏函数) 设置默认值的
functools.partial(函数,默认值)
@functools.wraps(func) # 添加的目的说就是引用原函数的文档
dir(__builtins__) 在终端可以执行
垃圾回收
整数有对象池:
1.小整数
2.大整数 不同的解释器就会有不同的结果
cpython
ipython
区别