類成員可以分為兩類:
公有成員:到處都可以訪問,可以被繼承
私有成員:外部不能訪問,只能類內部去訪問和修改(當修改修改的時候,可以利用內部的方法去呼叫私有屬性去供外部修改),不能被繼承。
定義的時候前面加上兩個__ 下劃線
class1. python 中一切皆為物件!girl:
def__init__
(self, name, age):
self.name =name
self.
__age =age
deflook_age(self):
return self.__age
defmodify_age(self):
self.
__age += 1
return self.__age
g = girl('
li', 18)
#g.__name # 直接報錯,私有成員,外部不能直接訪問
(g.look_age())
print(g.modify_age())
class由上可以看出,foo是type類的物件。foo:
pass
obj =foo()
(type(obj)) # 或者使用__class__這個方法
(type(foo))
#obj是物件, foo類的物件
#foo也是物件,type類的物件
python中建立類的兩種寫法:
第一種就是上面的**
第二種使用type來建立,並不常用,第一種寫法中預設的object省略了。
def2. metaclass 定義類function(self):
print('
123'
)foo = type('
foo', (object,), )
上面的foo預設是type來建立的,那麼我們可以認為,我們所說的類也是乙個物件,type類的物件。
我們使用繼承,來研究下類的執行過程。
class我們在前面一直說,類()執行,類()自動執行__init__方法,物件()自定執行__call__方法。那現在類也是物件(type的物件)了,那它是怎麼執行的。mytype(type): # 繼承type類
pass
class foo(metaclass=mytype): #
預設類都是type建立(繼承也是),我們通過metaclass來定義,類由誰來建立。
pass
print(mytype.__class__
)print(foo.__class__
)執行結果:
'type
'>
**從上而下來執行,讓我們來看這個過程。
1. 類是type建立的,建立類時,自動執行type的__init__方法
2. 類() 執行type的__call__方法。(此時類是type的物件,所以執行call)
3. 再呼叫類中的__new__,類的__init__方法
python中反射,是以字典的形式來查詢的,可hash的,查詢速度非常快。
1. 反射的由來,程式的輸入,一般都是字串,而類中的方法都是變數名。 沒有辦法把字串轉換為變數名。
class2. 那我們應該如何利用字元床查詢裡面變數,進行輸出呢。方法1:__dict__方法f:
def__init__
(self, name, age):
self.name =name
self.age =age
obj =f()
obj.
'name'#
報錯,物件中的name是變數,不是字串
b = '
name
'obj.b
#查詢不到,因為是去找b這個變數,類中沒有
class f:方法2:就是反射def __init__(self, name, age):
self.name = name
self.age = age
obj = f('li', 18)
obj.__dict__['name']
反射就是通過字串來操作類成員。 這四個是python為類提供的內建函式。
getattr() 獲取值hasattr() 判斷有沒有setattr() 設定屬性delattr() 刪除屬性可針對匯入的模組進行反射,匯入的模組也是物件。
3. 反射的應用場景
在web框架或其他地方程式,乙個類中有很多方法,如果用if來判斷,輸入,多少個方法,就需要多少個判斷。蛋疼死。直接反射。
class單例模式從字面上看,只有乙個類物件。socket連線web:
defnew(self):
pass
defrun(self):
pass
#還有n多個方法
obj =web()
inp = input('')if
hasattr(obj, inp):
getattr(obj, inp)()
#幾行**就搞定,用if需要不斷的判斷
物件導向 高階
json方式的物件導向 json 把方法包在json裡 json物件導向 有人管他叫 命名空間 在公司裡 把同一類 的方法包在一起 拖拽和繼承 物件導向的拖拽 改寫原有的拖拽 繼承 asdf 拖拽 instanceof 檢視物件是某個類的例項 使用繼承 限制範圍的拖拽類 建構函式的偽裝 屬性的繼承 ...
物件導向高階
public class person public void print public class student extends person 重寫了父類方法 public void print public class demo public class demo 1.不能new這個類,只能靠...
物件導向高階
私有屬性,不能被子類繼承,在屬性的前面加上 就變為了私有屬性 私有方法,不能被子類繼承,在方法的前面加上 就變為了私有方法 只在前面加,後面不加,一般前後都有 的,屬於類當中自帶的方法或屬性 class class test1 str1 a 私有屬性 def init self pass def m...