對象獨有的名稱空間: 在產生對象時就賦初值
class Student:
def __init__(self, stu_name, sex):
self.name = stu_name
self.sex = sex # 一般建議參數名與新增的屬性名同名
stu = Student('Bob', 'male') # 實例化對象
print(stu.name, stu.sex)
'''
# __init__方法會在實例化對象時被調用
# 1.會爲實例化的對象造成空的名稱空間
# 2.就是一個方法,能夠被傳參,在 類名(實參) 這種方式下調用並傳參 __init__(self, 形參)
# 3.第一個self就是要產生的當前對象
# 重點:在方法內部,形參拿到了實參值,利用self.屬性名 = 形參 = 實參值,對對象的名稱空間添加屬性
'''
類中方法的第一個默認參數:對象方法
class A:
# 對象方法
def test(self, num):
pass
a = A()
# 調用方法
# 二級優化
a.test(10)
# 一級優化
A.test(a, 10)
# 實現原理
A.__dict__['test'](a, 10)
# 總結:對象a傳遞給self,數字10傳遞給num
# 重點:方法的第一個參數必定是調用該方法的對象
類中@classmethod修飾的方法:類方法
class Tool:
@classmethod
def add(cls, n1, n2): # 統一類與對象均可以調用類方法,必定有默認傳入第一個參數
return n1 + n2
# 建議
Tool.add(10, 20) # 默認第一個傳入自身 - Tool
# 不建議
tool = Tool()
tool.add(100, 200) # 默認第一個傳入自身所屬類 - tool.__class__
屬性與方法的總結
class OldBoy:
# 屬於類的屬性
name = '老男孩'
# 屬於對象的屬性
def __init__(self, name):
self.name = name
# 屬於類的方法
# 需求:獲取機構的名字
@classmethod
def get_class_name(cls):
return cls.name
# 屬於對象的方法
# 需求:獲取校區的名字
def get_school_name(self):
return self.name
# 先建立校區
shanghai = OldBoy('上海校區')
shenzhen = OldBoy('深圳校區')
# 類方法的使用
# 建議使用類調用
print(OldBoy.get_class_name())
# 類方法拿對象調用並無多少新增的意義,不建議拿對象調用
print(shanghai.get_class_name())
print(shenzhen.get_class_name())
# 對象方法的使用
# 類調用對象方法,必須把要操做的對象手動傳入,不建議使用
print(OldBoy.get_school_name(shanghai))
print(OldBoy.get_school_name(shenzhen))
# 對象調用對象方法,默認將自身傳入,建議使用
print(shanghai.get_school_name())
print(shenzhen.get_school_name())
組合
# 組合:自定義類的對象做爲另一個類的屬性
class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age
t1 = Teacher("Ben", 17)
class Student:
# 學生能夠有 老師 屬性
def __init__(self, name, age, teacher):
self.name = name
self.age = age
# 組合
self.teacher = teacher
stu = Student('Bob', 18, t1)
# 訪問老師具體的信息
print(stu.teacher.name)
print(stu.teacher.age)
面向對象的三大特性
# 封裝:隱藏細節 - 抽離共有
# 繼承:
# 多態: