目錄
類class
1. 類的定義
關鍵字:class
語法:
class 類名:
# 類裏面的代碼
類名命名規範:遵循標識符的命名規範,風格採用大駝峯命名法,例如CatType
- 類定義的兩種方式
# 這兩種定義類的方式無差別
# 類定義的第一種方式:不寫繼承的父類,默認繼承object。
class MyTest:
pass
# 類定義的第二種方式:在類名的括號後面指定繼承object這個類。
class MyClass(object):
pass
# object: python中所有類的基類(祖宗類)
示例:
class Cat:
pass
class Dog:
pass
class TestCase:
pass
2. 通過類創建對象
對象 = 類名()
關於對象,有人叫對象,也有人叫實例。
通過類來創建對象(實例化對象)。可以創建多個對象,每個對象的內存地址都不一樣。
示例:
class Cat:
pass
# 通過類來創建對象(實例化對象)。可以創建多個對象,每個對象的內存地址都不一樣。
kitty = Cat()
print(id(kitty)) # 輸出結果:2108715911296
coffee = Cat()
print(id(coffee)) # 輸出結果:2108716016880
類屬性和實例屬性
- 類屬性
這一類事物擁有的共同特徵,我們通常會定義爲類屬性。
在類裏面直接定義的變量,叫做類屬性。
類屬性:可以通過類和對象去訪問
有兩種方式可以訪問類屬性:
通過對象訪問類屬性:對象名.屬性名。
通過類訪問屬性:類名.屬性名。
示例:
class Cat:
# 類屬性
leg = '四條腿'
tail = '長尾巴'
# 通過對象訪問類屬性:對象名.屬性名
kitty = Cat()
print(kitty.leg) # 輸出結果:四條腿
coffee = Cat()
print(coffee.tail) # 輸出結果:長尾巴
# 通過類訪問屬性:類名.屬性名
print(Cat.leg) # 輸出結果:四條腿
- 實例屬性
每個對象的屬性值都有可能不一樣,就應該定義爲實例屬性(對象屬性)。
實例屬性的定義:對象.屬性名=屬性值。
對象屬性(實例屬性):只能對象自己能用。
示例:
class Cat:
# 類屬性
leg = '四條腿'
tail = '長尾巴'
# 實例化對象
kitty = Cat()
coffee = Cat()
# 給對象添加屬性
kitty.name = 'kitty'
kitty.age = 2
coffee.name = 'coffee'
coffee.age = 3
# 通過對象訪問對象屬性:對象名.屬性名
print(kitty.name) # 輸出結果:kitty
print(kitty.age) # 輸出結果:2
print(coffee.name) # 輸出結果:kitty
print(coffee.age) # 輸出結果:3
類屬性的分類
類屬性的分類:
1. 公有屬性:既可以在類內部使用,又可以在類的外部被調用。
2. 私有屬性:使用雙下劃線開頭。只能在類外部使用,在類外面無法被調用。
示例:
class Cat:
# 公有屬性
attr = 'I have tail'
# 私有屬性
__attr = 'I have 4 legs'
def print_attr(self):
print('在類的內部訪問公有屬性', self.attr)
print('在類的內部訪問公有屬性', self.__attr)
Kitty = Cat()
print('在類的外部訪問公有屬性', Kitty.attr)
# 在類外部調用私有屬性會報錯: AttributeError: 'Cat' object has no attribute '__attr'
# print('在類的外部訪問公有屬性', Kitty.__attr)
Kitty.print_attr()
關於如何在類裏面定義對象屬性
定義在類裏面的函數叫方法。
__init__方法:
初始化方法;
在創建對象的時候,會自動調用執行裏面的代碼。
關於方法中的第一個參數self:self代表對象,不用手動傳參,調用該方法時會自動傳入。
示例:
class Cat:
# 類屬性
leg = '四條腿'
tail = '長尾巴'
def __init__(self):
# 初始化方法
print('這裏是打印self', id(self), self)
print('這個是__init__方法在調用')
kitty = Cat() # 輸出結果:這裏是打印self 1396410304640 <__main__.Cat object at 0x00000145208A4880>
print('這裏是打印kitty', id(kitty), kitty)
# 輸出結果:這裏是打印self 1396410304640 <__main__.Cat object at 0x00000145208A4880>
print('----------------------')
coffee = Cat() # 輸出結果:這裏是打印self 2197480466656 <__main__.Cat object at 0x000001FFA40AE8E0>
print('這裏是打印coffee', id(coffee), coffee)
# 輸出結果:這裏是打印coffee 1796880263392 <__main__.Cat object at 0x000001A25E68E8E0>
__init__方法
__init__方法的作用:初始化對象屬性
示例:
class Cat:
# 類屬性
leg = '四條腿'
tail = '長尾巴'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
kitty = Cat('hello kitty', 1, 'female')
print(kitty.name)
coffee = Cat('coffee cat', 2, 'male')
print(kitty.age)
類裏面的方法
特徵 + 行爲
特徵:屬性(類屬性和實例屬性)
行爲:方法(類方法和實例方法)
方法的本質就是類裏面的函數。
實例方法:
第一個參數時self, self代表的是對象本身,哪個對象調用該方法,self就代表哪個對象。
實例方法只能通過對象去調用。
實例方法不能通過類去調用,調用會報錯。
類方法:
@classmethod進行裝飾(標識);
第一個參數時cls, cls代表的是類本身。
可以通過類和對象去調用。
靜態方法:
@staticmethod進行裝飾;
可以通過類和對象去調用。
示例:
class Cat:
# 類屬性
leg = '四條腿'
tail = '長尾巴'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
# 實例方法
def skill_01(self, skill_name):
print('{}會{}!'.format(self.name, skill_name))
# 實例方法
def skill_02(self):
print('{}會爬樹!'.format(self.name))
@classmethod
def class_method(cls):
print('這是一個類方法!')
print('打印cls', cls)
@staticmethod
def static_method():
print('這是一個靜態方法!')
# 通過對象調用實例方法
kitty = Cat('hello kitty', 1, 'female')
kitty.skill_01('跳舞')
coffee = Cat('coffee cat', 2, 'male')
coffee.skill_02()
# 通過類迪調用實例方法
# Cat.skill_02() # 報錯:TypeError: skill_02() missing 1 required positional argument: 'self'
print('-------------------------')
# 通過類訪問類方法:類名.類方法名
Cat.class_method()
# 通過對象調用類方法:對象名.類方法名
kitty.class_method()
print('-------------------------')
# 通過類訪問靜態方法:類名.類方法名
Cat.static_method()
# 通過對象調用靜態方法:對象名.類方法名
kitty.static_method()
類方法,靜態方法,實例方法的應用場景
類方法:在方法內部只會使用到類屬性。
靜態方法:方法內部既不會使用類相關的屬性和方法, 也不會使用實例(對象)相關的屬性和方法。
實例方法:在方法內部會使用到對象相關的屬性或方法,那麼適合定義爲對象方法。
示例:
class Cat:
# 類屬性
leg = '四條腿'
tail = '長尾巴'
def __init__(self, name, age, gender):
# 實例(對象)屬性
self.name = name
self.age = age
self.gender = gender
# 實例方法
def skill_01(self):
print('{}會跳舞!'.format(self.name))
self.move()
def move(self):
print('快速移動')
# 類方法
@classmethod
def class_method(cls):
print('這是貓類的共同特徵:{}{}!'.format(cls.leg, cls.tail))
print('打印cls', cls)
#靜態方法
@staticmethod
def static_method():
print('裏面的代碼和類和對象沒有太多相關性!')
kitty = Cat('kitty', 1, 'female')
kitty.skill_01()