物件導向高階 二

2021-08-21 23:41:20 字數 4965 閱讀 3254

一.總結回顧

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這個類,只能靠...