定義類并創(chuàng)建對(duì)象
在Python中定義類的寫法為:class 類名:
即可定義出一個(gè)類(注意:類名首字母大寫)
由類創(chuàng)建對(duì)象的寫法為變量名 = 類名()
Python中的屬性
Python中的屬性可分為兩類:
1.類屬性:由類來維護(hù)的屬性及舍,對(duì)象在訪問這種屬性時(shí)哆档,訪問的是同一個(gè)值(即砌左,對(duì)象的共有財(cái)產(chǎn))
2.實(shí)例屬性:通過類創(chuàng)建出來的對(duì)象擁有,每個(gè)對(duì)象都維護(hù)自己獨(dú)有的屬性
可以將類屬性理解為公有屬性悦施,實(shí)例屬性理解為私有屬性
類屬性寫法:直接在類中添加屬性名和屬性值
class Student:
country = 'china' # 類屬性
stu1 = Student()
實(shí)例屬性寫法:實(shí)例屬性定義在__init__
函數(shù)里面并扇,且該函數(shù)接收的第一個(gè)參數(shù)(一般寫為self
)是指針類型且永遠(yuǎn)指向該類創(chuàng)建出來的某個(gè)對(duì)象(即,通過類創(chuàng)建對(duì)象的時(shí)候抡诞,指針指向就確定了),函數(shù)接收的其它參數(shù)為創(chuàng)建對(duì)象時(shí)所需的形參
class Student:
country = 'china'
def __init__(self, name, age):
self._name = name # 實(shí)例屬性_name
self._age = age # 實(shí)例屬性_age
stu1 = Student('李四', '18')
__init__
函數(shù)在調(diào)用類創(chuàng)建對(duì)象過程中會(huì)自行調(diào)用執(zhí)行土陪,不需要手動(dòng)調(diào)用__init__
函數(shù)
Python中的方法
Python中的方法可分為三類:
1.類方法:屬于類的方法昼汗,由類來維護(hù)(對(duì)象的公有財(cái)產(chǎn))
2.實(shí)例方法:屬于對(duì)象的方法,由對(duì)象自己維護(hù)的方法(對(duì)象的私有財(cái)產(chǎn))
3.靜態(tài)方法:函數(shù)占據(jù)了類的命名空間鬼雀,調(diào)用時(shí)需要通過類名+方法名才能調(diào)用顷窒。靜態(tài)方法和通過該方法創(chuàng)建出來的對(duì)象沒有任何關(guān)系
可以將類方法理解為公有方法,實(shí)例方法為私有方法
只有是沒有調(diào)用過類、對(duì)象下的屬性鞋吉,就可以聲明為靜態(tài)方法
類方法的寫法:通過系統(tǒng)裝飾器@classmethod
聲明函數(shù)為類方法鸦做,且該函數(shù)接收的第一個(gè)參數(shù)(一般寫為cls
)是指針類型,指向的是類本身谓着,類方法只能訪問類屬性泼诱,不能訪問實(shí)例屬性。函數(shù)接收的其它參數(shù)為創(chuàng)建對(duì)象時(shí)所需的形參
@classmethod
def say(cls):
print('我來自:' + cls.country)
# print('我來自:' + cls._age)
# 報(bào)錯(cuò):AttributeError: type object 'Student' has no attribute '_age'
stu1.say() # 我來自:china
實(shí)例方法的寫法:直接在類里添加函數(shù)赊锚,不需要裝飾器修飾治筒,其它寫法和類方法一樣,第一個(gè)參數(shù)一般寫為self
用以區(qū)分舷蒲。實(shí)例方法既訪問類屬性耸袜,也能訪問實(shí)例屬性
def hello(self):
print('我的祖國是:' + self.country)
print('我叫:' + self._name)
stu1.hello() # 我的祖國是:china 我叫:李四
靜態(tài)方法的寫法:通過系統(tǒng)裝飾器@staticmethod
聲明函數(shù)為類方法
@staticmethod
def soy():
print('我是打醬油的')
Student.soy() # 我是打醬油的
創(chuàng)建一個(gè)簡(jiǎn)單的類
class Student:
country = 'china'
def __init__(self, name, age):
self._name = name
self._age = age
@classmethod
def say(cls):
print('我來自:' + cls.country)
def hello(self):
print('我的祖國是:' + self.country)
print('我叫:' + self._name)
@staticmethod
def soy():
print('我是打醬油的')
stu1 = Student('李四', '18')
stu1.say()
stu1.hello()
Student.soy()
特性:property
特性作用及寫法
作用:如果調(diào)用特性,則用戶只能訪問牲平,不能設(shè)置堤框;隱藏真實(shí)的實(shí)例屬性,防止用戶亂更改或誤操作
寫法:通過系統(tǒng)裝飾器@property
聲明函數(shù)
class Circle:
def __init__(self, r):
self._r = r
@property
def r(self):
return self._r
cir = Circle(10);
print(cir.r)
設(shè)置器作用及用法
作用:專門提供給特性使用纵柿,用來修改特性的值
寫法:通過系統(tǒng)裝飾器@特性名.setter
聲明函數(shù)
@r.setter
def r(self, num):
if type(num) is int:
self._r = num
else:
print('請(qǐng)?jiān)O(shè)置整數(shù)值')
cir.r = 20
刪除器作用及寫法
作用:通過del刪除某個(gè)特性時(shí)胰锌,如果定義了刪除器,該操作會(huì)執(zhí)行刪除其中的代碼
寫法:通過系統(tǒng)裝飾器@特性名.deleter
聲明函數(shù)
@r.deleter
def r(self):
print('can not delete')
del cir.r # 不加刪除器會(huì)報(bào)錯(cuò):AttributeError: can't delete attribute
屬性私有化
讓當(dāng)前類的私有屬性不會(huì)被子類繼承到
Python中私有化機(jī)制:是屬性名改寫藐窄。在所有需要私有化的屬性前添加__
资昧,則該屬性名就會(huì)變成:_類名__屬性名
class Student:
def __init__(self):
self.__name = '張三'
def say(self):
print('hello,我是' + self.__name)
stu = Student()
stu.say();
print(stu._Student__name)
# print(stu.name) 報(bào)錯(cuò):AttributeError: 'Student' object has no attribute 'name'
繼承
聲明繼承關(guān)系:在子類名后跟小括號(hào),小括號(hào)里是要繼承的父類名
注意:
1.在繼承父類實(shí)例屬性時(shí)荆忍,要先手動(dòng)調(diào)用父類的init函數(shù)
繼承關(guān)系中的init方法的執(zhí)行邏輯:在子類沒有實(shí)現(xiàn)init方法時(shí)格带,會(huì)觸發(fā)父類中的init執(zhí)行;如果子類實(shí)現(xiàn)了init刹枉,不會(huì)觸發(fā)父類的init執(zhí)行
2.在子類復(fù)寫父類時(shí)叽唱,要先手動(dòng)調(diào)用父類相應(yīng)的方法
class A:
def __init__(self):
self.name = 'zhangsan'
print('我是父類的init')
def say(self):
print('我是父類')
# 聲明繼承關(guān)系:在子類名后跟小括號(hào),小括號(hào)里是要繼承的父類名
class B(A):
def __init__(self):
# 手動(dòng)調(diào)用父類的init函數(shù)
A.__init__(self)
print('我是子類的init')
def bSay(self):
print('我是子類')
# 在子類中復(fù)寫父類
def say(self):
A.say(self)
print('我是復(fù)寫的新數(shù)據(jù)')
b = B()
print(b.name)