1.內(nèi)置類屬性
創(chuàng)建類的時(shí)候,系統(tǒng)默認(rèn)為我們添加的類的屬性
class Person:
"""人類"""
number = 61
def __init__(self, name, age=0, gender='女'):
self.name = name
self.age = age
self.gender = gender
def object_func(self):
print('對(duì)象方法:' + self.name)
@classmethod
def class_func(cls):
print('類方法', cls.number)
@staticmethod
def static_func():
print('靜態(tài)方法')
def __repr__(self):
return '<<%s.%s object at %s>>' % (self.__class__.__module__,
self.__class__.__name__,
hex(id(self)))
p1 = Person('小明', 18, '男')
"""
類.__doc__ - 類的說(shuō)明文 :字段
類.__name__ - 獲取類的名字 :字段
對(duì)象.__class__ - 獲取對(duì)象的類 :對(duì)象屬性
類\對(duì)象.__dict__ - 獲取類中所有的字段與其對(duì)應(yīng)的值\獲取對(duì)象中所有的對(duì)象屬性與其對(duì)應(yīng)的值 :字段\對(duì)象屬性
"""
"""
類.__module__ - 獲取類聲明在哪個(gè)模塊中
類.__bases__ - 返回當(dāng)前類的所有父類
"""
print(Person.__module__)
# 魔法方法:
# __str__:系統(tǒng)自帶的魔法方法,可以定制當(dāng)前類的對(duì)象的打印值,返回一個(gè)字符串(單獨(dú)打印對(duì)象的效果)
# __repr__:系統(tǒng)自帶的魔法方法,可以定制當(dāng)前類的對(duì)象的打印值,返回一個(gè)字符串,適用范圍更廣(對(duì)象作為元素的時(shí)候的打印效果)
print(p1)
# 2.slots魔法
# 當(dāng)在類中給__slots__賦值后,當(dāng)前類的__dict__屬性無(wú)效
class Dog:
# __slots__ = ('name', 'age')
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return str(self.__dict__)
dog = Dog('大黃', 3)
# del dog.age
print(dog)
在很多的高級(jí)面向?qū)ο笳Z(yǔ)言中,會(huì)將屬性和方法分為公開(kāi)的(在類的外部可以使用)、
私有的(只能在類的內(nèi)部使用,不能被繼承)、
收受保護(hù)的(只能在類的內(nèi)部使用,可以被繼承)
"""
2.python
python中類的內(nèi)容本質(zhì)上全部都是公開(kāi)的.私有和公開(kāi)都只是約定
私有化 -- 內(nèi)容只能在類的內(nèi)部使用,不能再外面使用.
在類中的方法名或者屬性名前加'',
當(dāng)聲明類的時(shí)候在名字前加'',內(nèi)部會(huì)在這個(gè)基礎(chǔ)前面再加'_類名'
屬性保護(hù) - 可以通過(guò)在對(duì)象屬性名前加'',把這個(gè)屬性標(biāo)記成受 保護(hù)類型;為了告訴別人這個(gè)屬性在使用的時(shí)候
不要直接用,而是通過(guò)getter和setter來(lái)使用
a.getter - 獲取對(duì)象的屬性值之前想要干點(diǎn)別的事情,那么就給這個(gè)屬性添加getter
第一步:在對(duì)應(yīng)的屬性名前加
第二步:聲明函數(shù),聲明前使用@property,函數(shù)無(wú)參數(shù),有一個(gè)返回值,并且函數(shù)名時(shí)屬性名去掉''
第三步 獲取屬性值的時(shí)候,通過(guò)' 對(duì)象.屬性名去掉下劃線'去獲取
b.setter - 給屬性賦值前干別的事情,就給這個(gè)屬性添加setter.(想要添加setter,必須現(xiàn)有g(shù)etter)
第一步:在對(duì)應(yīng)的屬性名前加
第二步:在@屬性名去掉''.setter,有且只有一個(gè)參數(shù),沒(méi)有有返回值,并且函數(shù)名時(shí)屬性名去掉''
"""
class Person:
def __init__(self, name, _age):
self.name = name
self._age = _age
@property
def age(self):
return self._age + 1
@age.setter
def age(self, a):
self._age = a
p1 = Person('1', 4)
print(p1.age)
p1.age = 1
print(p1.age)
# 3.拋出異常
"""
a.語(yǔ)法
raise 異常類型
b.說(shuō)明
raise - 關(guān)鍵字
異常類型 - 可以是系統(tǒng)提供的異常類型,也可以自定義異常類型(必須繼承Exception)
"""
class WeekValueError(Exception):
def __str__(self):
return 'Warning'
# 4.自定義類型
# 寫(xiě)一個(gè)類繼承Exception,然后重寫(xiě)__str__方法來(lái)自定義錯(cuò)誤信息
# 練習(xí):給age屬性添加getter和setter,獲取年齡的時(shí)候拿到年齡值,和這個(gè)年齡對(duì)應(yīng)的階段
# 給age賦值的時(shí)候必須是整數(shù),并且范圍在0 - 150,如果不滿足要求報(bào)錯(cuò):AgeError
class AgeError(Exception):
def __str__(self):
return '年齡范圍應(yīng)在0到150歲之間并且為整數(shù)'
class Person:
def __init__(self, name, age=0):
self.name = name
self._age = age
@property
def age(self):
if self._age in range(0, 18):
return '青年', self._age
elif self._age in range(18, 50):
return '成年', self._age
elif self._age in range(50, 150):
return '老年', self._age
@age.setter
def age(self, x):
if x in range(0, 150):
self._age = x
else:
raise AgeError
p1 = Person('1')
print(p1.age)
p1.age = 56
print(p1.age)
p1.age = 177
print(p1.age)
1.什么是繼承:讓子類直接擁有父類所有的屬性和方法
父類 - 被繼承者, 子類 - 繼承者
python中所有的類都是直接或者間接的繼承object
2.怎么繼承
"""
class 子類(父類列表)
類的內(nèi)容
"""
3.子類中添加內(nèi)容
"""
添加字段和方法,直接添加
對(duì)象屬性的添加
super().父類方法()(在子類的方法中去調(diào)用父類的方法)
"""