Python學(xué)習(xí)總結(jié)【連載】(十一坪圾,十二)
2018.06.27 Juttachen
概述
+ 37 類的定義
+ 38 對象屬性和init方法
+ 39 self
+ 40 屬性的增刪改查
+ 41 內(nèi)置類屬性
三十七、類的定義
復(fù)習(xí)
類:具有形同屬性和功能的對象的集合兽泄;是抽象的
對象:類的實例;具體的
1.類的聲明
格式:
class 類名(父類):
屬性
方法
class 類名:
屬性
方法
a.class:python中聲明類的關(guān)鍵字
b.類名:標(biāo)識符胃珍。特殊規(guī)范:首字母大寫蜓陌,見名知意。
c.屬性:分類的字段和對象的字段 ----------->屬性
d.方法:分對象方法(構(gòu)造方法)填抬,類方法隧期,靜態(tài)函數(shù) ---------->功能
1)方法:就是聲明在類中的函數(shù)(都有一個默認(rèn)參數(shù),不需要調(diào)用的時候給他傳值)
2)對象方法:在類中直接聲明的函數(shù)仆潮,帶一個參數(shù)self,要使用對象來調(diào)用
# 聲明類
class Person:
"""人類""" # 類的說明文檔
# 在類中聲明了eat方法,默認(rèn)有一個參數(shù)self檐晕,調(diào)用eat防范的時候蚌讼,不需要給delf傳參
# 在類中直接聲明的函數(shù)都是對象方法,對象方法必須使用對象來調(diào)用
def eat(self):
print('吃飯')
# 直接寫在類中的函數(shù)芥喇,必須帶參數(shù)self
# def run()
# print('aaa')
# 注意:如果要在類中聲明帶參才能的對象方法凰萨,那么其他的參數(shù)必須寫在self的后面
def run(self,num):
print('跑了%s米'%(num))
2. 創(chuàng)建對象
通過類名就可以創(chuàng)建對象,然后可以用變量存起來
可以通過對象去調(diào)用類中的對象方法武通,和使用類中聲明的對象屬性(字段)
p1 = Person()
# p1就是Person類的一個實例(對象)
調(diào)用對象方法珊搀,對象.方法()
寫在類里面的函數(shù)也可以傳參
p1.eat()
p1.run(100)
一個類可以創(chuàng)建多個對象
p2 = Person()
p2.eat(80)
三十八、對象屬性和init方法
實例一:init方法會自動被調(diào)用境析。
_ init _方法又叫構(gòu)造方法派诬。是在通過類創(chuàng)建對象的時候默赂,自動調(diào)用的方法括勺。
_ init _方法的作用就是在創(chuàng)建對象的時候初始化對象的屬性。
_ init _:對象的屬相就是聲明在整個方法中
class Person:
def __init__(self):
# 在這個地方聲明對象的屬性朝刊。。冯挎。
print('這個是init')
在聲明對象的時候會自動調(diào)用init方法
p1 = Person()
p2 = Person()
實例二:帶參的init方法
init的方法的方法名固定:init咙鞍。但是參數(shù)是可以隨意改變的(但是self參數(shù)不變)
class Dog:
def __init__(self,name):
print('名字是:%s'%(name))
通過類創(chuàng)建對象的時候,要保證init方法里面的每一個參數(shù)都有值翰守。通過類后面的括號里傳參來保證每個參數(shù)都有值疲酌。
dog1 = Dog('蔡蔡')
實例三:對象屬性
屬性:聲明在類中的變量
對象屬性:要通過對象去使用;不同的對象可能會有不同的值:
class Person2:
"""人類"""
# 在init方法中聲明對象的屬性:self.屬性名 = 初值
def __init__(self):
# 聲明一個對象屬性name:初始值為空串
self.name = ''
# 聲明一個對象屬性age:初始值為10
# 通過Person2類創(chuàng)建對象1
p1 = Person2
# 通過對象去修改P1的name屬性
p2 = Person2
# p1.name = 'print(p2.name)
練習(xí):聲明一個學(xué)生類湿颅,擁有屬性:名字粥诫,年齡,電話怀浆。擁有方法:學(xué)習(xí)
class Student:
def __init__(self):
self.name = ''
self.age = 18
self.tel = 12345678910
def study(self):
print('學(xué)習(xí)')
stu = Student()
stu.name = '韓梅梅'
print(stu.name,stu.age,stu.tel)
# 調(diào)用對象方法(給對象發(fā)送消息)
stu.study()
實例四:創(chuàng)建對象的時候賦初值
class Student2:
def __init__(self,name1='',age1=1,tel1=''):
self.name = name1
self.age = age1
self.tel = tel1
# 在創(chuàng)建對象的時候給對象屬性賦初值
stu2 = Student2('小明', 18,'112')
print(stu2.name)
stu3 = Student2(name1="小王")
三十九执赡、self
類中的對象方法都有一個默認(rèn)參數(shù)self:
1.調(diào)用帶有默認(rèn)參數(shù)self的方法,不需要給self傳參搀玖。系統(tǒng)會自動將調(diào)用當(dāng)前方法的對象傳給self
2.在方法中使用self就相當(dāng)于使用調(diào)用方法的對象(只能使用self,不能重新給self賦值)
class Person:
"""人"""
def __init__(self, name='', age=''):
"""聲明對象的屬性"""
self.name = name
self.age = age
def eat(self):
print('%s eat breakfirst.' % (self.name))
# 聲明一個對象的方法run
def run(self):
print('self', self)
print('run now!!')
# 在對象方法中使用對象的屬性灌诅,直接用self去獲取屬性
print('%s run now' % (self.name))
self.eat()
# 創(chuàng)建一個Person對象
p1 = Person('小明', 10)
# 通過對象p1去調(diào)用run方法,系統(tǒng)會將self = p1
# 這個時候在run方法中猜拾,p1和self是同一個東西
p1.run()
print('p1', p1)
# eat中的self = p1
p1.eat()
p2 = Person('小紅', 20)
p2.run()
p2.eat()
練習(xí):聲明一個圓類,擁有屬性:半徑 擁有方法:計算圓的面積顽聂,計算圓的周長
import math
# 或者 from math import pi(之后就不需要寫math.pi盯仪,而是直接寫pi)
class Circle:
def __init__(self, radius=10):
self.r = radius
# 在對象方法中可以通過self去使用對象
def area(self):
C = math.pi * self.r ** 2
# 注意要 return C 或者直接 return math.pi * self.r ** 2
def perimeter(self):
l = 2 * math.pi * self.r
return l
# 同上道理
c1 = Circle()
print('%.2f' % c1.area())
print('%.2' % c1.perimeter())
c2 = Circle(3)
print(c2.area())
四十、屬性的增刪改查
class Dog:
"""狗狗"""
def __init__(self,name = '',age = 0):
self.name = name
self.age = age
dog1 = Dog('才才')
1.查
方法一:對象.屬性
特點:如果屬性村子就獲取屬性的值耀石。如果屬性不存在就會報錯爸黄。
print(dog1.name)
# print(dog1.score) # AttributeError: 'Dog' object has no attribute 'score'
方法二:getattr(對象,屬性名炕贵,默認(rèn)值) --> 獲取指定對象的指定屬性
如果不設(shè)置默認(rèn)值:屬性如果存在就獲取屬性的值称开,不存在就會報錯
如果設(shè)置默認(rèn)值:屬性如果存在就獲取屬性的值,不存在不僅不報錯鳖轰,而且將默認(rèn)值作為結(jié)果(但是不創(chuàng)建屬性)
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
print(getattr(dog1,'name'))
print(getattr(dog1,'score',100))
# print(getattr(dog1,'color')) # AttributeError: 'Dog' object has no attribute 'color'
# print(getattr(dog1,'score')) # AttributeError: 'Dog' object has no attribute 'score'
方法三:對象.getattribute(屬性名)
獲取指定對象的指定屬性脆霎。如果屬性不存在就會報錯。
print(dog1.__getattribute__("name"))
# print(dog1.__getattribute__("sex")) # 和方法一一樣報錯
2.改(修改)
方法一:對象.屬性 = 新值
dog1.name = '大黃'
print(dog1.name)
方式二:setattr(對象睛蛛,屬性名鹦马,新值)
setattr(dog1,'name','小黃')
print(dog1.name)
方式三:對象.setattr()
dog1.__setattr__('name','小黑')
3.增(添加屬性)
python中可以動態(tài)的給對象添加屬性
方法一:
用對象.屬性 = 新值就可以增加(只要對象不存在)
dog1.sex = '男'
print(dog1.sex)
方式二:setattr(對象,不存在的屬性名忆肾,新值)
setattr(dog1,'color','brown')
print(dog1.color)
方式三:對象.setattr()
dog1.__setattr__('score','100')
print(dog1.score)
4.刪除屬性
方法一:del 對象.屬性
將dog1的age屬性刪除
del dog1.age
# print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'
方法二:delattr(對象荸频,屬性名)
delattr(dog1,'age')
# print(dog.age) # AttributeError: 'Dog' object has no attribute 'age'
方法三:對象.delattr(屬性名)
dog1.__delattr__('age')
# print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'
5.判斷對象是否擁有某個屬性
方式:hasattr(對象,'屬性名') ----> 判斷指定的對象是否擁有指定的屬性
result = hasattr(dog1,'name')
print(result)
補充:
實例1:對象屬性的操作只對當(dāng)前那一個對象有效
class Person:
def __init__(self,name = '',age = 0,id_num = '',sex = ''):
"""人"""
self.name = name
self.age = age
self.id_num = id_num
self.sex = sex
p1 = Person('小明',10)
# 給不存在的屬性賦值,就是添加屬性
p1.score = 100
print(p1.score+100)
p2 = Person('羅昊',30)
# print(p2.score) #AttributeError: 'Person' object has no attribute 'score'
注意:1.對對象屬性的增客冈,刪旭从,改,查是指定那一個對象。不會影響其他的對象和悦。
2.實際開發(fā)的時候退疫,一般只用獲取對象屬性的值和修改對象屬性的值。想添加或刪除屬性鸽素,一般都是在init方法中操作
實例二:
class Dog:
"""狗"""
# 通過給__slots__賦值褒繁,可以限制類中對象的屬性有哪些,防止一個不必要的屬性被添加
__slots__ = ('name','age','color')
def __init__(self,name='',age=0,color=''):
self.name = name
self.age = age
self.color = color
# self.sex = '男' # 在__slots__ 中沒有sex的話棒坏,不管在哪都不能添加,只能先在__slots__ 中添上才能添加
dog1 = Dog('笑話',3,'Yellow')
dog1.name1 = '大黃'
del dog1.name
# 注意__slots__ 中規(guī)定的屬性只能少不能多遭笋。刪除屬性是不受影響的坝冕。
四十一、內(nèi)置類屬性
class Dog:
"""狗"""
def __init__(self,name='',age=0,color=''):
self.name = name
self.age = age
self.color = color
def run(self):
print('%s跑起來'%(self.name))
def shout(self):
print('%s在叫喚'%(self.name))
dog = Dog()
內(nèi)置的類屬性是屬于類的瓦呼,需要通過類去使用
1. 類.name :獲取類的名字
class_name = Dog.__name__ # 'Dog'
print(class_name,type(class_name))
# 這個屬性只有類有
2.類.doc:獲取類的說明文檔
print(Dog.__doc__)
3.類.dict(對象.dict):獲取類中所有的類屬性(類字段)
print(Dog.__dict__)
print(dog.__dict__) #獲取了所有關(guān)于dog的屬性和值(以字典鍵值對的方式)【包括添加的】
4.類.module:獲取類所在的模塊的名字
print(Dog.__module__)
5.類.bases :獲取指定類的基類
print(Dog.__bases__)