day15--總結(jié) 面向?qū)ο?/h1>
-
1.什么是內(nèi)置屬性
1.什么是內(nèi)置屬性
聲明類(lèi)的時(shí)候系統(tǒng)自動(dòng)添加的屬性(可能是字段也可能是對(duì)象屬性)
class Person:
"""
說(shuō)明文檔: 人類(lèi)
num - 人類(lèi)的數(shù)量
name - 人的名字
"""
num = 61
# 注意: 如果設(shè)置了__slots__的值叠萍,那么當(dāng)前類(lèi)的對(duì)象就不能使用__dict__屬性
# __slots__ = ('name', 'gender', 'age')
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
def eat(self,food):
print('%s在吃%s' % (self.name, food))
#定制當(dāng)前類(lèi)的對(duì)象的打印
#1)重寫(xiě)__str__方法,這個(gè)方法的返回值就是對(duì)應(yīng)的打印結(jié)果(類(lèi)型必須是字符串)
def __str__(self):
return '姓名:{}中符,年齡:{},性別:{}'.format(self.name, self.age, self.gender)
return '<'+str(self.__dict__)[1:-1]+'>'
#2)重寫(xiě)__repr__方法某宪,這個(gè)方法的返回值就是對(duì)應(yīng)的打印結(jié)果(類(lèi)型必須是字符串)
def __repr__(self):
return '<' + str(self.__dict__)[1:-1]+ '>'
p1 = Person('小明', '男'跨跨,18)
-
1.name
類(lèi)的字段;類(lèi)名.name - 獲取類(lèi)的名字(是個(gè)字符串)
print(Person.__name__) # Person
-
2.doc
類(lèi)的字段疯特;類(lèi)名.__doc__ - 獲取類(lèi)的說(shuō)明文檔
print(Person.__doc__) #
-
3.class
對(duì)象屬性;對(duì)象.__class__ - 獲取對(duì)象的類(lèi) (和 type(對(duì)象) 的功能一樣)
print(p1.__class__) # <class '__main__.Person'>
print(type(p1)) # <class '__main__.Person'>
-
4.dict - 將對(duì)象轉(zhuǎn)換成字典
對(duì)象屬性哗魂;對(duì)象.__dict__ -- 將對(duì)象中所有的屬性以屬性和對(duì)應(yīng)的值轉(zhuǎn)換換成一個(gè)字典中的鍵值對(duì)(一個(gè)對(duì)象一個(gè)字典)
類(lèi)的字段;類(lèi).__dict__ - 將類(lèi)轉(zhuǎn)換成一個(gè)字典漓雅,字典中的元素是類(lèi)中所有的字段和對(duì)應(yīng)的值
注意:如果設(shè)置了__slots__的值录别,當(dāng)前類(lèi)的對(duì)象就不能使用__dict__屬性
print(p1.__dict__) - # {'name': '小明', 'gender': '男', 'age': 18}
-
5.module
類(lèi)的字段;類(lèi).__module__ - 獲取當(dāng)前類(lèi)是在哪個(gè)模塊中聲明的邻吞,返回值是一個(gè)模塊名稱(chēng)
print(Person.__module__) # __main__
-
6.bases
類(lèi)的字段组题;類(lèi).__bases__ - 獲取當(dāng)前類(lèi)的父類(lèi)(返回的是一個(gè)元組)
print(Person.__bases__) # (<class 'object'>,)
私有化
-
1.訪(fǎng)問(wèn)權(quán)限:公開(kāi),保護(hù)抱冷,私有
公開(kāi):公開(kāi)的屬性和方法在類(lèi)的內(nèi)部崔列,外部都能用,可以被繼承
保護(hù):保護(hù)的屬性和方法在類(lèi)的類(lèi)部?jī)?nèi)用旺遮,外部不能用赵讯,能被繼承
私有:私有的屬性和方法在類(lèi)的內(nèi)部和外部都不能用,不能被繼承
-
2.python中屬性和方法的訪(fǎng)問(wèn)權(quán)限
python中所有的屬性和方法都是公開(kāi)的
怎么私有化:在需要私有化的屬性或者方法名前加'__'(注意不能以'__'結(jié)尾)
python中私有化原理:在私有化的屬性和方法前加'_類(lèi)名'
屬性的getter 和setter
在我們需要在獲取屬性值之前做點(diǎn)別的事情耿眉,就需要給這個(gè)屬性添加getter
當(dāng)需要給屬性賦值之前做別的事情边翼,需要給這個(gè)屬性添加setter
-
1.給屬性添加getter
1)屬性命名的時(shí)候前面添加'_'
2)在@property裝飾器的后面聲明一個(gè)對(duì)象方法
a.將屬性去掉下劃線(xiàn)作為方法名
b.方法除了self以外不需要其他參數(shù)
c.函數(shù)的返回值就是獲取這個(gè)屬性的時(shí)候得到的值
3)在外部使用屬性的時(shí)候,通過(guò)'對(duì)象.屬性(不帶下劃線(xiàn))'去使用
注意:獲取屬性值得時(shí)候鸣剪,就會(huì)自動(dòng)調(diào)用getter對(duì)應(yīng)的方法
-
2.屬性添加setter
屬性添加setter之前先添加getter(一般兩個(gè)一起用)
1)屬性名前加'_'
2)在@getter名.setter后面聲明對(duì)象
a.將屬性下劃線(xiàn)去掉作為方法名
b.需要一個(gè)self以外的參數(shù)
c.不需要返回值
3)在外部使用屬性的時(shí)候组底,通過(guò)'對(duì)象.不帶下滑線(xiàn)的屬性'去使用
注意:當(dāng)給屬性賦值的時(shí)候,實(shí)質(zhì)上是調(diào)用setter對(duì)應(yīng)的方法
-
練習(xí):寫(xiě)一個(gè)矩形類(lèi)
- 有屬性:長(zhǎng)西傀,寬斤寇,面積,周長(zhǎng)
- 要求從生活的角度去看這個(gè)矩形
class Rectangle:
def __init__(self, long, width):
self._long = long
self._width = width
self._area = 0
self._perimeter = 0
@property
def long(self):
return self._long
@long.setter
def long(self, value):
if not(isinstance(value, int) or isinstance(value, float)):
raise ValueError
if value < 0:
raise ValueError
self._long = value
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if not(isinstance(value, int) or isinstance(value, float)):
raise ValueError
if value < 0:
raise ValueError
self._width = value
@property
def area(self):
self._area = self._width * self._long
return self._area
@area.setter
def area(self, value):
return ValueError
@property
def perimeter(self):
self._perimeter = 2 * (self._width + self._long)
return self._perimeter
@perimeter.setter
def perimeter(self, value):
return ValueError
r1 = Rectangle(100, 300)
print(r1.perimeter)
print(r1.area)
r1.width = 200
print(r1.width, r1.perimeter, r1.area)
# r1.long = 'nnn'
print(r1.long)
類(lèi)方法和靜態(tài)方法
-
1.類(lèi)中的方法
1)對(duì)象方法:(對(duì)象能做的的事拥褂,self都能做)
a.怎么申明:直接聲明
b.怎么調(diào)用:用對(duì)象調(diào)用 '對(duì)象.對(duì)象方法()'
c.特點(diǎn):有指向當(dāng)前對(duì)象的self
d.什么時(shí)候用:如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象屬性娘锁,就要選對(duì)象方法
2)類(lèi)方法:(類(lèi)能做的事 ,cls都能做)
a.怎么聲明:聲明在@classmathod后面
b.怎么調(diào)用:用類(lèi)來(lái)調(diào)用 '類(lèi).類(lèi)方法()'
c.特點(diǎn):有自帶參數(shù)cls饺鹃,表示當(dāng)前類(lèi)莫秆;這個(gè)參數(shù)在調(diào)用的時(shí)候不用傳參间雀,系統(tǒng)自動(dòng)將當(dāng)前類(lèi)傳給他;
cls:誰(shuí)調(diào)用就指向誰(shuí)(如果是對(duì)象就指向?qū)ο髮?duì)應(yīng)的類(lèi))
d.什么時(shí)候用:實(shí)現(xiàn)函數(shù)的功能不需要對(duì)象屬性但需要類(lèi)的字段镊屎,就要用類(lèi)方法
3)靜態(tài)方法:
a.怎么聲明:聲明在@staticmethod后面
b.怎么調(diào)用:通過(guò)類(lèi)來(lái)調(diào)用 '類(lèi).靜態(tài)方法()'
c.特點(diǎn):沒(méi)有默認(rèn)參數(shù)
d.什么時(shí)候用:實(shí)現(xiàn)函數(shù)的功能對(duì)象和類(lèi)都不需要惹挟,就要靜態(tài)方法
繼承
-
1.什么是繼承
繼承就是讓子類(lèi)直接擁有父類(lèi)的屬性和方法
子類(lèi) - 繼承者
父類(lèi) - 被繼承著
-
2.怎么繼承
1)語(yǔ)法:
class 類(lèi)名(父類(lèi)1, 父類(lèi)2缝驳,...):
說(shuō)明文檔
類(lèi)的內(nèi)容
2)說(shuō)明:
() - 固定寫(xiě)法连锯,如果省略相當(dāng)于(object)
聲明類(lèi)的時(shí)候如果沒(méi)有寫(xiě)父類(lèi),默認(rèn)繼承object(object又叫基類(lèi))
父類(lèi) - 一個(gè)類(lèi)的父類(lèi)可以多個(gè)
在子類(lèi)中可以通過(guò)supper()去調(diào)用分類(lèi)的方法(只能在對(duì)象方法和類(lèi)方法中使用)
在子類(lèi)添加對(duì)象屬性用狱,先通過(guò)supper()調(diào)用父類(lèi)的__init__來(lái)繼承父類(lèi)的對(duì)象屬性
class Person:
num = 61
def __init__(self):
print('Person中init')
self.name = '小明'
self.age = 18
self.gender = '男'
self.__a = 10
def eat(self, food='米飯'):
print('{}在吃{}'.format(self.name, food))
@classmethod
def show(cls):
print('人類(lèi)的數(shù)量:%d' % cls.num)
@staticmethod
def func1():
print('人類(lèi)')
def func2(self):
print('我是'+self.name)
class Student(Person):
num = 10
def __init__(self):
# 在子類(lèi)中添加對(duì)象屬性运怖,需要先通過(guò)super()去調(diào)用父類(lèi)的__init__來(lái)繼承父類(lèi)的對(duì)象屬性
super().__init__()
print('Student中init')
self.study_id = '001'
self.class1 = 'py1904'
# 添加功能
def study(self):
print(self.name+'在好好學(xué)習(xí)!')
@staticmethod
def func1():
print('學(xué)生')
def func2(self):
print('我是學(xué)生!')
# 在子類(lèi)中可以通過(guò)super()可以去調(diào)用父類(lèi)的方法
# 注意: super()只能在對(duì)象方法和類(lèi)方法中使用
super().func2()
stu1 = Student()
print(Student.num) # 10
print('===================')
print(stu1.name, stu1.age, stu1.gender) # 小明 18 男
print('===================')
stu1.eat() # 小明在吃米飯
print('===================')
Student.show() # 人類(lèi)的數(shù)量:10
print('===================')
print(stu1.__dict__) # {'name': '小明', 'age': 18, 'gender': '男', '_Person__a': 10, 'study_id': '001', 'class1': 'py1904'}
print('===================')
Student.func1() # 學(xué)生
print('===================')
stu1.func2() # 我是學(xué)生!
# 我是小明