一、使用动态创建类:
1.类也是对象(属于元类的对象)
#打印字符串(字符串是对象)
print("HelloWorld")
#打印类名,类同样为一个对象
print(Person)
2.使用动态创建类:
语法:
type(类名,由父类名称组成的元组(可以为空),包含属性的字典(名称和 值))
2.1 使用type创建类
class Person(object):
pass
p = Person()
print(p)
# 动态创建Person1
Person1 = type("Person1",(),{})
p1 = Person1()
print(p1)
2.2 使用type创建带有属性(方法)的类
# 定义一个函数
def show(self):
print("---name---%s"%self.name)
# 使用type创建一个带有属性的类
Person2 = type('Person2',(),{'show':show,'name':'xxx'})
# 使用type创建的类,来创建一个对象p2
p2 = Person2()
# p2.name = 'xxx'
# 添加属性
# setattr(p2,'name','xxx')
p2.show()
2.3 使用type动态创建一个继承指定类的类
class Animal():
def __init__(self,color="Yellow"):
self.color = color
def eat(self):
print("吃死你")
Dog = type("Dog",(Animal,),{})
dog = Dog()
dog.eat()
print(dog.color)
2.4 手动指定元类
def test123(name,parents,attr):
# 默认需要三个参数
return type(name,parents,{})
# 通过metaclass手动指定父类
class Animal(object,metaclass=test123):
def __init__(self,color="Yellow"):
self.color = color
def eat(self):
print("吃")
a = Animal()
a.eat()
二、类装饰器
class Test(object):
def __init__(self,func):
print("--初始化--")
print("func name is %s"%func.__name__)
self.__func = func
# 重写该方法后,对象可以直接进行调用
def __call__(self):
print("--装饰器中的功能--")
self.__func()
# @Test 等价于 test = Test(test) 装饰器特性
@Test
def test():
print('--test 函数---')
# 本身test指向函数test,但是装饰器将test指向了对象。
# 对象本身不可以被调用,但是重写__call__方法之后则会被调用
test()
执行结果:
--初始化-
func name is test
--装饰器中的功能-
--test 函数--
三、对象池
GC机制(垃圾回收机制)
内存泄露
1、引用计数的处理
增加
创建对象出来引用计数 1
d = Dog()
多一个多想使用,引用计数+1
b = d;
加到列表中,引用计数+1
list1 = [d]
方法调用,+1
show(d)
减少:
引用计数-1
del d
指向改变:引用计数-1
d = Dog()
d = Cat()
引用计数-1
list1.remove(d)
方法使用完毕,计数-1
2、隔代回收的处理
import gc
class AAA():
def __init__(self):
print('object: born at:%s' % hex(id(self)))
def start():
gc.set_threshold(200, 10, 10)
for i in range(200):
a = AAA()
b = AAA()
a.v = b
b.v = a
# 获取内存情况
print(gc.get_count())
# 打印垃圾回收频率
print(gc.get_threshold())
del a
del b
# 关闭gc机制
# gc.disable()
start()
# 查看某个对象的引用计数
import sys
str1 = "洪文"
print(sys.getrefcount(str1))
list1 = []
list1.append(str1)
print(sys.getrefcount(str1))
list1.remove(str1)
print(sys.getrefcount(str1))
四、内建属性
4.1 常用内置类属性
__dict__:类的属性(包含一个字典,由类的数据属性组成)
__doc__: 类的文档字符串
__name__: 类名
__module__: 类定义所在的模块
__bases__: 类的所有父类构成元素(包含了以个由所有父类组成的元组)
4.2 属性拦截器__getattribute__
class Test(object):
def __init__(self,var1):
self.var1 = var1
# 该方法在获取对象属性的时候会被调用,
def __getattribute__(self,obj):
if obj == 'var2':
print("属性var1拦截成功")
return '我是拦截后替换的数据'
else:
# 如果拦截不成功,可以调用父类的方法,这时候obj的值就是
init中的值
return object.__getattribute__(self,obj)
# 如果在__getattribute__方法中,
# 使用使用self访问属性,或者方法,都会导致程序崩溃
# return self.var1
def show(self):
print("我是show方法")
s = Test("python")
# 成员变量 var1会被以字符串的形式('var1')传递给__getattribute__方
法的obj
print(s.var1)
# 方法的访问也可以通过属性拦截器进行拦截
s.show()
五、内建函数
5.1常用内建函数:
1.range()
2.map()
map(function,iterable...)
function ---函数
iterable ---一个或多个序列 ,返回的是迭代对象
from collections import Iterable
from collections import Iterator
def func(x,y):
return x * y
v = map(lambda x:x*2,[1,2,3])
print(type(v))
print(isinstance(v,Iterable))
print(isinstance(v,Iterator))
for i in v:
print(i)
v1 = map(func,[1,2,3],[4,5,6])
v2 = list(v1)
print(type(v2))
3.filter()
filter(function,iterable)
function --判断函数
iterable --可迭代对象
def func2(x):
return x % 2 == 0
# 1 - 100 中的偶数
list2 = filter(func2,[x for x in range(1,101)])
print(isinstance(list2,Iterator))
for i in list2:
print(i)
4.reduce()
#求1+2+...+100
from functools import reduce
result = reduce(lambda x,y:x+y,[x for x in range(1,101)])
print("result:%d"%result)
result1 = reduce(lambda x,y:x+y,['1','2','3'],'4')
print(result1)
5.sorted()
sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作, 而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行
的操作
class Stu():
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return self.name + str(self.age)
students = [("john",'A',15),('jane', 'B', 12), ('dave', 'B', 10)]
students = sorted(students,key = lambda s:s[1])
print(students)
# 自定义对象排序,要引用函数
students = [Stu('aa',12),Stu('sf',24),Stu('fh',45)]
students1 = sorted(students,key = lambda x:x.name)
for s in students1:
print(s)
六、集合
# 集合
v1 = {1}
print(type(v1))
# 添加元素
v1.add(4)
v1.add(5)
v1.add(6)
# 重复元素无法添加进去
v1.add(1)
v1.update()
# 删除元素
v1.remove(1)
print(v1)
# 定义两个集合
set1 = {1,2,3}
set2 = {3,4,5}
# & 丨 - ^
print(set1 & set2)
print(set1 | set2)
print(set1-set2)
print(set1 ^ set2)