一.總結回顧
1.類(定義):
靜態屬性,類屬性(變數) 直接寫在類中,全大寫
動態屬性,方法(函式) self
類方法 @classmethod cls
靜態方法 @staticmethod 沒有預設引數|
2.呼叫"
物件名.動態屬性()/類名.動態屬性(物件)
類名.靜態屬性/物件名.靜態屬性
類名.類方法()/物件名.類方法()
類名.靜態方法/物件名.靜態方法()
3.私有
__名字
靜態屬性
動態屬性
類方法靜態方法
屬性4.私有的有什麼特點
只能在類中呼叫
不能被繼承
5.什麼時候用私有的
當不想被外部呼叫也不想被繼承,只想在類內部使用的時候
當在外部使用到的時候 ,想給使用者的使用前/後直接加上某些功能
私有 + property使用
6.3w1h
what 這個到東西是什麼
where 在哪兒用
why 為什麼這麼用
how 怎麼用
二.內建函式
1.isinstance
class a:pass
class b(a):pass
b = b()
print(isinstance(b,a)) #isinstance(o,t)
print(type (b) is a)
true
false
原因與區別:isinstance(物件名,類名),物件是否是該類的物件,只要物件是本類或本類的子類物件就為true
type 物件名 is 類名 ,只有當物件是本類的子類時才為true,不包含繼承關係
2.issubclass
class a:pass
class b(a):pass
b = b()
print(isinstance(b,a)) # b是否為a的子類
3.反射
用字串資料型別的變數名來訪問這個變數的值
反射的方法: getattr,hasattr,setattr,delattr
1.getattr
class student:
role = "student"
def _init__(self, name):
self.name = name
@classmethod
def check_course(self):
print("檢視課程")
def choice(self):
print("選擇課程")
def check_choice(self):
print("檢視已選課程")
@staticmethod
def login():
print("登入")
print(student.role)
print(getattr(student,"role"))
getattr(student,"check_course")()
getattr(student,'login')()
student
student
檢視課程
登入
class manager:
dic = [ ('創造學生賬號', 'create_student'),
('建立課程','create_course'),
('檢視學生資訊','check_student_info'),
]def __init__(self,name):
self.name = name
def create_student(self):
print('建立學生賬號')
def create_course(self):
print('建立課程')
def check_student_info(self):
print('檢視學生資訊')
class student:
dic = [
('檢視所有課程', 'check_course'),
('選擇課程', 'choose_course'),
('檢視已選擇的課程', 'choosed_course')
]def __init__(self,name):
self.name = name
def check_course(self):
print('check_course')
def choose_course(self):
print('choose_course')
def choosed_course(self):
print('檢視已選擇的課程')
def login():
username = input("user:")
password = input("pwd")
with open("linshi")as f:
for line in f :
user,pwd,ident = line.strip().split("|") # genji|12345|manager 預處理後解包賦值
# roadhog|12345|student
if username == user and password == pwd:
print('登陸成功!')
return username,ident
import sys
def main():
u_name,id =login()
file = sys.modules["__main__"] #file:檔案物件
cls = getattr(file,id)
obj = cls(u_name)
dic = cls.dic
while 1:
for num,i in enumerate(dic,1):
print(num,i[0])
choice = int(input("序號》"))
getattr(obj,dic[choice-1][1])()
main()
三.內建方法
類中的特殊方法/內建方法,雙下方法,魔術方法(magic_method)
類中的每乙個雙下方法都有他自己的特殊意義
1.__call__ 相當於 物件
class a:
def __call__(self, *args, **kwargs):
print("call方法執行了")
def call(self):
print("執行call")
class b:
def __init__(self,cls):
print("例項化a之前做一些事情")
self.a = cls()
self.a()
print("例項化a之後做一些事情")
# a = a()
# a()
b(a)
例項化a之前做一些事情
call方法執行了
例項化a之後做一些事情
call方法執行了
2.__len__ 相當於 len(obj)
class mylist:
def __init__(self):
self.lst = [1,2,3,4,5,6]
self.name = "genji"
self.age = 20
def __len__(self):
print("執行了__len__了")
return len(self.lst)
l = mylist()
print(len(l))
len(l) # 相當於去呼叫了__len__方法,return的值就是len函式的返回值,去過乙個obj物件的類中沒有__len__方法,那麼len函式會報錯
執行了__len__了
6執行了__len__了
3.__new__ 特別重要,開闢記憶體空間
# __new__ 寫乙個單例類
class single:
__instance = none
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, name):
self.name = name
s = single("genji")
s1 = single("mccree")
print(s.__dict__)
print(s1.__dict__)
print(s.name)
print(s1.name)
mccree
mccree
__str__ str(obj),"%s"%obj,print(obj)
所有的雙下方法沒有需要你在外部直接呼叫的
而是有一些其他的內建函式,特殊的語法來自動觸發這些雙下方法
class student:
def __str__(self):
return"%s" % self.name
def __init__(self,name):
self.name = name
print(student("genji"))
genji
物件導向高階 二
一 item系列 getitem setitem 和 delitem 二 類的特殊變數 slots 三 迭代器協議 iter 和 next 四 module 和 class 五 類的描述資訊 doc 六 析構方法 del 七 enter 和 exit 八 call 九 元類 class foo de...
物件導向 高階
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這個類,只能靠...