Python--元類

1、使用動態建立類:python

  1.類也是對象(屬於元類的對象)app

    #打印字符串(字符串是對象)函數

    print("HelloWorld")spa

    #打印類名,類一樣爲一個對象code

    print(Person)對象

  2.使用動態建立類:blog

   語法:排序

    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()

2、類裝飾器

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 函數--

3、對象池

GC機制(垃圾回收機制)
內存泄露
一、引用計數的處理
增長
建立對象出來引用計數 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


二、隔代回收的處理
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、內建屬性

  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、內建函數

  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)

6、集合

#    集合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)
相關文章
相關標籤/搜索