Python_面向物件
類的定義
Python使用class關鍵字來定義類,class關鍵字之後是一個空格,接下來是類的名字,如果派生(繼承)自其他基類的話,則需要把所有基類放到一對圓括號中並使用逗號分隔,然後是一個冒號,最後換行並定義類的內部實現。類的首字母一般要大寫
語法格式 :
class 類名(object): 定義構造方法,例項化時初始化類的屬性 def 兩個下劃線+init+兩個下劃線(self, 屬性): self.屬性 = 屬性
定義類的方法 def 方法名(self): 方法體
建立例項/物件 物件名 = 類名(引數)
呼叫方法 物件名.方法名()
新增屬性或修改屬性 物件名.屬性名 = 屬性
刪除屬性 del 物件名.屬性名
示例
class Student(object):
# 定義構造方法
def __init__(self, name, score):
self.name = name
self.score = score
# 定義方法
def printInfo(self):
print("%s : %d" % (self.name, self.score))
# 建立兩個個物件
stu1 = Student("小白", 99)
stu2 = Student("小安", 80)
# 呼叫方法
stu1.printInfo()
# 新增屬性;在stu1物件中新增的新屬性,只在stu1中生效,在別的物件中不能使用
stu1.age = 18
print(stu1.age)
# print(stu2.age)
# 修改屬性;#在stu1中修改的屬性同樣只在stu1中生效,與別的物件無關
stu1.name = "小黑"
stu1.printInfo()#>>>小黑 : 99
stu2.printInfo()#>>>小安 : 80
# 刪除屬性;在stu1中刪除的屬性同樣只在stu1中生效,與別的物件無關
del stu1.name
# print(stu1.name)
print(stu2.name)
❤️ 注意 __init__方法的第一個引數永遠是self,表示建立的例項本身(類似Java中的this),因此,在__init__方法內部,就可以把各種屬性繫結到self, 因為self就指向建立的例項本身;某個物件呼叫其方法時,Python解析器會把這個物件名作為第一個引數傳遞給self,所以開發者只需要傳遞後面的引數即可。 有了__init__方法,在建立例項的時候,就不能傳入空的引數了,必須傳入與__init__方法匹配的引數,但self不需要傳,Python解析器自己會把例項物件名傳進去。 在類的定義中,__init__並不是必需的。只有當需要區分由該類建立的不同物件時,才需要指定__init__方法
資料成員-例項變數與類變數
資料成員可以大致分為兩類:屬於物件的資料成員(例項變數)和屬於類的資料成員(類變數);例項變數主要指在建構函式__ init __()中定義的(當然也可以在其他方法中定義),定義和使用時必須以self作為字首(這一點是必須的),同一個類的不同物件(例項)之間的資料物件成員之間互不影響;屬於類的資料物件是該類所有物件共享的,不屬於任何一個物件,在定義類時這類資料成員不在任何一個成員方法的定義中。在主程式中或類的外部,例項變數成員屬於例項,只能通過物件名訪問;而類變數成員屬於類,可以通過類名或物件名訪問。另外,在Python中可以動態地為類和物件增加成員
class Student(object):
name = “UserPython” #類變數–屬於類的資料成員
age = 18
def __init __ (self, age):
self.age = age #例項變數–屬於物件的資料成員
def printInfo(self):
print("%s" % self.age)
不用建立例項即可直接訪問類變數
print(Student.name)
>>>UserPython
可以通過“物件名.類變數”訪問類變數;優先訪問例項變數,如果例項變數沒有再訪問類變數
stu1 = Student(19)
print(stu1.name, stu1.age)
>>>UserPython 19
通過stu1修改類變數,其實並不是真的修改了類變數,而是在stu1中新建立了一個name例項變數,這個與類變數無關,與其他例項物件無關
stu1.name = “HHHH”
print(stu1.name, Student.name)
>>>HHHH UserPython
stu2 = Student(20)
print(stu2.name)
print(Student.name)
>>>UserPython,因為stu2中沒有新增例項變數name,所以返回的是類變數name
>>>UserPython
直接修改類變數
Student.name = “UUUU”
print(stu1.name)
print(Student.name)
>>>HHHH 因為優先訪問例項變數所以還是返回“HHHH”
>>>UUUU
私有屬性與私有方法
class Student(object):
def init(self, name, age):
self.__name = name #在屬性的前面加上兩個下劃線即可讓該屬性變成私有屬性
self.age = age
def __del__(self):
pass
如果想獲取私有屬性可以定義一個方法來訪問私有屬性,因為同一個類中,私有屬性是可見的,只是在類外部私有屬性不可訪問 def getName(self): print(self.__name)
#同樣的想修改私有屬性,可以通過定義一個方法來修改
def setName(self, name):
self.__name = name
def printInfo(self):
print("%s : %d" % (self.__name, self.age))
#在方法的前面加上兩個下劃線即可讓該方法變成私有方法,外部無法訪問
def __showInfo(self):
print("%s : %d" % (self.__name, self.age))
stu1 = Student(“小白”, 18) stu1.printInfo() #>>>小白 : 18
print(stu1.__name) #不能再訪問私有屬性 print(stu1.age) #非私有屬性依舊可以訪問
stu1.getName() #可以通過定義一個方法訪問私有屬性 stu1.setName(“小小白”)
stu1.printInfo() #>>>小小白 : 18