1. 程式人生 > >Python_面向物件

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