12. 所用軟件
- 畫圖軟件:Faststone capture
13. 抽象類
抽象方法:沒有具體實現(xiàn)內(nèi)容的方法稱為抽象方法
抽象方法的主要意義是規(guī)范了子類的行為和接口
-
抽象的使用需要借助abc模塊
import abc
抽象類:包含抽象方法的類叫做抽象類闽寡,通常成為ABC類
-
抽象類的使用
- 抽象類可以包含抽象方法尼酿,也可以包含具體方法
- 抽象類中可以有方法也可以有屬性
- 抽象類不允許直接實例化
- 必須繼承才可以使用,且繼承的子類必須實現(xiàn)所有繼承來的抽象方法
- 假定子類沒有實現(xiàn)所有繼承的抽象方法涎永,子類也不能實例化
- 抽象類的主要作用是設(shè)定類的標(biāo)準(zhǔn)羡微,以便于開發(fā)的時候具有統(tǒng)一的規(guī)范
14. 自定義類
- 類其實是一個類定義和各種方法的自由組合
- 可以定義類和函數(shù)妈倔,然后自己通過類來直接賦值
- 可以借助于MethodType實現(xiàn)
- 借助于type實現(xiàn)
- 利用元類實現(xiàn)- MetaClass
- 元類是類
- 被用來創(chuàng)造別的類
# 變量的三種用法
class A():
def __init__(self):
self.name = "haha"
self.age = 18
a = A()
# 屬性的三種用法
# 1. 賦值
# 2. 讀取
# 3. 刪除
a.name = "ruochen"
print(a.name)
del a.name
# print(a.name)
ruochen
# 類屬性 property
# 應(yīng)用場景:
# 對變量除了普通的三種操作启涯,還想增加一些附加的操作,那么可以通過property完成
class A():
def __init__(self):
self.name = "haha"
self.age = 18
# 此功能黎做,是對類變量讀取操作的時候應(yīng)該執(zhí)行的函數(shù)功能
def fget(self):
print("我被讀取了")
return self.name
# 模擬的是對變量進(jìn)行寫操作的時候執(zhí)行的功能
def fset(self, name):
print("我被寫入了蒸殿,但是還可以做好多事情")
self.name = name + "1"
# fdel模擬的是刪除變量的時候進(jìn)行的操作
def fdel(self):
pass
# property的四個參數(shù)順序的固定的
# 第一個參數(shù)代表讀取的時候需要調(diào)用的函數(shù)
# 第二個參數(shù)代表寫入的時候需要調(diào)用的函數(shù)
# 第三個是刪除
name2 = property(fget, fset, fdel, "這是一個property的例子")
a = A()
print(a.name)
print(a.name2)
haha
我被讀取了
haha
# 抽象
class Animel():
def sayHello(self):
pass
class Dog(Animel):
def sayHello(self):
print("問一下對方")
class Person(Animel):
def sayHello(self):
print("Kiss me")
d = Dog()
d.sayHello()
p = Person()
p.sayHello()
問一下對方
Kiss me
# 抽象類的實現(xiàn)
import abc
# 聲明一個類并且指定當(dāng)前類的元類
class Hunam(metaclass=abc.ABCMeta):
# 定義一個抽象的方法
@abc.abstractmethod
def smoking(self):
pass
# 定義類抽象方法
@abc.abstractclassmethod
def drink():
pass
# 定義靜態(tài)抽象方法
@abc.abstractstaticmethod
def play():
pass
def sleep(self):
print("Sleeping......")
# 函數(shù)名可以當(dāng)變量使用
def sayHello(name):
print("{}你好".format(name))
sayHello("A")
liumang = sayHello
liumang("A")
A你好
A你好
# 自己組裝一個類
class A():
pass
def say(self):
print("Saying... ...")
class B():
def say(self):
print("Saying... ...")
say(9)
A.say = say
a = A()
a.say()
b = B()
b.say()
Saying... ...
Saying... ...
Saying... ...
# 組裝類例子 2
# 自己組裝一個類
from types import MethodType
class A():
pass
def say(self):
print("Saying... ...")
a = A()
a.say = MethodType(say, A)
a.say()
Saying... ...
help(MethodType)
Help on class method in module builtins:
class method(object)
| method(function, instance)
|
| Create a bound instance method object.
|
| Methods defined here:
|
| __call__(self, /, *args, **kwargs)
| Call self as a function.
|
| __delattr__(self, name, /)
| Implement delattr(self, name).
|
| __eq__(self, value, /)
| Return self==value.
|
| __ge__(self, value, /)
| Return self>=value.
|
| __get__(self, instance, owner, /)
| Return an attribute of instance, which is of type owner.
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __gt__(self, value, /)
| Return self>value.
|
| __hash__(self, /)
| Return hash(self).
|
| __le__(self, value, /)
| Return self<=value.
|
| __lt__(self, value, /)
| Return self<value.
|
| __ne__(self, value, /)
| Return self!=value.
|
| __reduce__(...)
| Helper for pickle.
|
| __repr__(self, /)
| Return repr(self).
|
| __setattr__(self, name, value, /)
| Implement setattr(self, name, value).
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __func__
| the function (or other callable) implementing a method
|
| __self__
| the instance to which a method is bound
type(8)
int
# 利用type造一個類
# 先定義類應(yīng)該具有的成員函數(shù)
def say(self):
print("Saying... ...")
def talk(self):
print("Talking... ...")
# 利用type來創(chuàng)建一個類
A = type("AName", (object, ), {"class_say":say, "class_talk":talk})
# 然后可以像正常一樣使用類
a = A()
dir(a)
a.class_say()
Saying... ...
# 元類演示
# 元類寫法是固定的爬骤,他必須繼承于type
# 元類一般命名以MetaClass結(jié)尾
class CMetaClass(type):
# 注意以下寫法
def __new__(cls, name, bases, attrs):
# 自己的業(yè)務(wù)處理
print("我是元類")
attrs['id'] = '000000'
attrs['addr'] = "1"
return type.__new__(cls, name, bases, attrs)
# 元類定義完就可以使用霞玄,使用注意寫法
class Teacher(object, metaclass=CMetaClass):
pass
t = Teacher()
t.__dict__
t.id
我是元類
'000000'