1. 程式人生 > >Python入門學習筆記————15(類完結)

Python入門學習筆記————15(類完結)

##變數的三種用法
class A ():
    def __init__(self):
        self._name = 'haha'
 
a = A()
#屬性的三種用法
#1.賦值
#2.讀取
#3.刪除
a.name = "狗蛋"
print(a.name)
del a.name
print(a.name)
狗蛋
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-8363ad424c07> in <module>()
     12 print(a.name)
     13 del a.name
---> 14 print(a.name)

AttributeError: 'A' object has no attribute 'name'

In [10]:

 

#類屬性property
#應用場景:
##對變數除了普通的三種操作,還想增加一些附加的操作,那麼可以同過property完成
class A():
    def __init__(self):
        self.name = 'haha'
        self.age = 18
    #對變數進行讀取操作時應該執行的函式功能
    def fget(self):
        print('我被讀取了')
        return self.name
    #對變數進行寫操作時
    def fset(self,n):
        print('我被寫入了')
        self.name = name + "hello"
    #刪除操作
    def fdel(self):
        pass
    #property三個引數的位置是固定的  先fget,然後fset,最後fdel
    name2 = property(fget,fset,fdel,"哈哈哈哈哈哈")
a =A()
print(a.name)
print(a.name2)
haha
我被讀取了
haha

抽象類

  • 抽象方法:沒有具體實現內容的方法稱為抽象方法
  • 抽象方法的主要意義是規範了子類的行為和介面
  • 抽象類的使用需要藉助abc模組
    • import abc
  • 抽象類:包涵抽象方法的類叫做抽象類,通常稱為ABC類
  • 抽象類的使用
    • 抽象類可以包含抽象方法,也可以包含具體的方法
    • 抽象類中可以有方法也可以有屬性
    • 抽象類不允許直接例項化
    • 必須繼承才能使用,且繼承的子類必須實現所繼承來的抽象方法
    • 假設子類沒有實現所有繼承的抽象方法,則子類也不能例項化
    • 抽象的主要作用是設定類的標準,以便開發的時候具有統一規範

In [12]:

 

#抽象
class Animel():
    def sayHello(self):
        pass
class Dog(Animel):
    print('聞一下對方')
class Person(Animel):
    print('kiss')
 
d = Dog()
d.sayHello()
p = Person()
p.sayHello()
聞一下對方
kiss

In [16]:

 

#抽象類的實現
import abc
#宣告一個類並指定當前類的元類
class Human(metaclass=abc.ABCMeta):
    #定義一個抽象方法
    @abc.abstractmethod
    def smoking(self):
        pass
    #定義類的抽象方法
    @abc.abstractclassmethod
    def drink():
        pass
    #定義靜態
    @abc.abstractstaticmethod
    def play():
        pass
    def sleep(self):
        print('sleeping')

自定義類

  • 類其實是一個類定義和各種方法的自由組合
  • 可以定義類和函式,然後自己通過類直接賦值
  • 可以藉助於MethodType實現
  • 藉助於type實現
  • 利用元類實現 MetaClass
    • 元類是類,用來創造別的類

In [17]:

 

#函式名可以當變數使用
def sayHello(name):
    print('{0}hello !'.format(name))
sayHello('yueyue')
people = sayHello
people('yueyue')
yueyuehello !
yueyuehello !

In [25]:

 

 
#自己組裝一個類
class A ():
    pass
def say(self):
    print('saying')
class B():
    def say(self):
        print('saying')
say(1)
A.say = say
a = A()
a.say()
b = B()
b.say()
saying
saying
saying

In [27]:

 

##自己組裝一個類 -2
from types import MethodType #
class A ():
    pass
def say(self):
    print('saying')
 
a = A()
a.say = MethodType(say,A) #通過MethodType方法將say與A繫結
a.say()
saying

In [29]:

 

#type
type(9)#返回了型別

Out[29]:

int

In [33]:

 

#利用type造一個類
#先定義類應該有的成員函式
def say(self):
    print('saying')
def talk(self):
    print('talking')
#用type創造一個類
A = type ('AName',(object,),{'class_say':say,'class_talk':talk})
#可以使用
a = A()
a.class_say()
a.class_talk()
saying
talking

In [39]:

 

#元類演示
#元類寫法固定,必須繼承自type
#元類一般命名以MetaClass結尾
class WzhiMetaClass(type):
    #注意以下寫法
    def __new__(cls,name,bases,attrs):
        print('我是元類')
        attrs['id']='0000'
        return type.__new__(cls,name,bases,attrs)
#元類定義完就可以使用
class Teacher(object,metaclass=WzhiMetaClass):
    pass
t = Teacher()
t.id
 
我是元類

Out[39]:

'0000'