学习Python的日子 Python高级(3)

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
    区别

猜你喜欢

转载自blog.csdn.net/qq_42240071/article/details/80447674
今日推荐