類與物件
classmethod類方法
staticmethod靜態方法
物件、子類判斷
反射
核心是過程 流水線思維
優點是:極大的降低了寫程式的複雜度,只需要順著要執行的步驟,堆疊**即可。
缺點是:一套流水線或者流程就是用來解決乙個問題,**牽一髮而動全身。
應用場景:一旦完成基本很少改變的場景,著名的例子有linux核心,git。
物件導向的程式設計的核心是物件,只要結果,不管你是如何執行的
優點是:解決了程式的擴充套件性。對某乙個物件單獨修改,會立刻反映到整個體系中,如對遊戲中乙個人物引數的特徵和技能修改都很容易。
缺點:可控性差,無法向面向過程的程式設計流水線式的可以很精準的**問題的處理流程與結果,存在不同改寫、繼承,有事對子物件的改寫會影響全域性
class 類名:
def__init__
(self,引數1
,引數2):
self.物件的屬性1
= 引數1
self.物件的屬性2
= 引數2
def 方法名(self)
:pass
def 方法名2
(self)
:pass
例項物件 = 類名(1,
2)#物件的例項化
靜態屬性就是直接在類中定義的變數
動態屬性就是定義在類中的方法
def __init__(self): 這句話可以寫也可以不寫,只要有引數參進來的時候就必須得寫;
self:在例項化時自動將物件/例項本身傳給__init__的第乙個引數
print(person.__name__,type(person.__name__)) #檢視類的名字(這裡的類名是字串型別的)
print(person.__dict__) #查出的是乙個字典,key為屬性名,value為屬性值
print(person.__doc__)# 就是把注釋顯示出來
print(dir(person)) #檢視類的方法,以列表的形式顯示出來
print(person.__module__) #類定義所在的模組
print(person.__class__)
print(isinstance(hy,person))#判斷物件 是否是類的例項
組合:組合指的是,在乙個類中以另外乙個類的物件(也就是例項)作為資料屬性,稱為類的組合
class
jinneng
:def
change
(self, obj)
:# 功能是變身
obj.height +=
1000
# 變高1000
class
person
:# 定義乙個人類
role =
'person'
# 人的角色屬性都是人
def__init__
(self, name)
: self.name = name
# 能變身
self.weapon = weapon(
)
me= person(
'egon'
)me.weapon.change(
)# me組合技能變身了
classmethod 修飾符對應的函式不需要例項化,不需要 self 引數,但第乙個引數需要是表示自身類的 cls 引數,可以來呼叫類的屬性,類的方法,例項化物件等。
classa(
object):
bar =
1def
func1
(self)
:print
('foo'
) @classmethod
deffunc2
(cls)
:print
('func2'
)print
(cls.bar)
cls(
).func1(
)# 呼叫 foo 方法
a.func2(
)# 不需要例項化就能呼叫
classc(
object):
@staticmethod
deff()
:print
('runoob');
c.f();
# 靜態方法無需例項化
cobj = c(
)cobj.f(
)# 也可以例項化後呼叫
isinstance(obj,cls):檢查obj是不是cls的物件(傳兩個引數,乙個是物件,乙個是類)
issubclass(sub,super):檢查sub是不是super的子類(傳兩個引數,乙個是子類,乙個是父類)
hasattr:hasattr(object,name)判斷乙個物件是否有name屬性或者name方法。有就返回true,沒有就返回false
getattr:獲取物件的屬性或者方法,如果存在則列印出來。hasattr和getattr配套使用
需要注意的是,如果返回的是物件的方法,返回出來的是物件的記憶體位址,如果需要執行這個方法,可以在後面新增一對()
setattr:給物件的屬性賦值,若屬性不存在,先建立後賦值
delattr:刪除該物件指定的乙個屬性
class
foo:
def__init__
(self)
: self.name =
'egon'
self.age =
51def
func
(self)
:print
('hello'
)egg = foo(
)print
(hasattr
(egg,
'name'))
#先判斷name在egg裡面存在不存在
print
(getattr
(egg,
'name'))
#如果為true它才去得到
print
(hasattr
(egg,
'func'))
print
(getattr
(egg,
'func'))
#得到的是位址
# getattr(egg,'func')() #在這裡加括號才能得到,因為func是方法
ifhasattr
(egg,
'func'):
getattr
(egg,
'func')(
)else
:print
('沒找到'
)
class
foo:
f =123 @classmethod
defclass_method_dome
(cls)
:print
('class_method_dome'
) @staticmethod
defstatic_method_dome()
:print
('static_method_dome'
)print
(hasattr
(foo,
'class_method_dome'))
method =
getattr
(foo,
'class_method_dome'
)method(
)print
('------------'
)print
(hasattr
(foo,
'static_method_dome'))
method1 =
getattr
(foo,
'static_method_dome'
)method1(
)
Python入門 物件導向
物件 有具體特徵和行為操作的事物 有具體 特徵 屬性和 行為 方法的物件 將物件行為特徵抽象化用 表示 1 還原生活場景 簡單的 操作 基礎語法,堆疊功能 變數 資料型別 運算 if while 函式式程式設計 將所有要處理的事情,開始封裝成具備一定處理功能的函式,呼叫執行 2 面向過程程式設計 開...
快速入門物件導向設計
物件導向設計把握乙個重要的經驗 誰擁有資料,誰就對外提供操作這些資料的方法。幾個典型的案例 人在黑板上畫圓 有人物件 黑板物件 圓物件,畫圓這個動作必須用到了圓心座標x y和半徑r,而x y r是圓內部的資料,圓擁有這些資料,所以這個動作時圓的,而不是黑板的,更不是人的。列車司機緊急剎車 有列車物件...
Java入門 物件導向一
物件導向與面向過程 面向過程 線性思維,事物比較簡單 物件導向 簡單的線性思維無法解決,利用大局思維找乙個能解決該問題的物件去解決問題,比如之前的鍵盤錄入就是找到scanner去解決問題。面對物件方便從巨集觀上管理,具體實現還是面向過程的方式。物件和類的關係 類是抽象的,類是確定物件會擁有的特徵 屬...