一贼陶、類和對象
1.什么是類,什么是對象
類就是擁有相同功能和相同屬性的對象的集合(重要) - 抽象的
對象就是類的實例 - 具體的
如果車是類孩灯,具體的某一輛車才是對象
2.類的聲明 —— 用代碼描述清楚這個類是哪些相同的功能和相同屬性的集合
"""
1)語法:
class 類名:
類的說明文檔
類的內(nèi)容
2)說明
class - 聲明類的關(guān)鍵字闺金,固定寫法
類名 - 程序員自己命名
要求: 標(biāo)識符,不能是關(guān)鍵字
規(guī)范: 見名知義峰档;采用駝峰式命名败匹;首字母大寫
類的說明文檔 - 用""""""引起來的說明性文字
類的內(nèi)容 - 用來描述共同的功能和屬性
主要包含方法(聲明在類中函數(shù))和屬性(聲明在類中的變量)
"""
# student_name -> PEP8 studentName -> 駝峰式命名
class Person:
"""人類"""
def eat(self):
print('人類吃飯')
def sleep(self):
print('人類睡覺')
def thinking(self):
print('思考')
def opertion(self, char):
print()
3.創(chuàng)建對象
語法:
類() —— 創(chuàng)建類的對象并且返回
p1 = Person()
# 同一個類的對象可以有對象
p2 = Person()
p3 = p2
print(id(p1), id(p2))
二、對象方法
1.類中的方法 —— 指就是類中共同的功能
方法 —— 聲明在類中的函數(shù)
類中的方法分為三種: 對象方法讥巡、類方法掀亩、靜態(tài)方法
2.對象方法
1)怎么聲明: 直接聲明在類中的函數(shù)就是對象方法
2)怎么調(diào)用: 需要對象來調(diào)用; 以'對象.對象方法()'的形式來調(diào)用
3)特點: 自帶參數(shù)self, 參數(shù)self在通過對象調(diào)用的時候不用傳參; 系統(tǒng)會自動將當(dāng)前對象傳給self傳參;
當(dāng)前對象 - 當(dāng)前調(diào)用這個方法的對象
當(dāng)前類的對象能做的事情欢顷,self都可以做
class Dog:
# eat就是對象方法
def eat(self, food='骨頭'):
# self=dog2; food='肉'
print('self:', self)
print('狗吃'+food)
# 對象能做的事情self都能做
self.run()
def run(self):
# self=dog2
print('狗跑步')
dog1 = Dog() # dog1就是Dog的對象
print('dog1:', dog1)
# dog1.eat()
dog2 = Dog()
print('dog2:', dog2)
dog2.eat('肉')
三槽棍、_ _ init _ _ 方法和構(gòu)造方法
"""
1)構(gòu)造函數(shù) - python中聲明類的時候,系統(tǒng)會自動聲明一個和類同名的函數(shù)(這個函數(shù)就是構(gòu)造函數(shù))抬驴;用來創(chuàng)建當(dāng)前類的對象炼七。
當(dāng)我們調(diào)用構(gòu)造函數(shù)創(chuàng)建對象的時候,系統(tǒng)會自動調(diào)用類中的__init__方法來初始化對象
2) init方法 - __init__是魔法方法怎爵;也是一個對象方法特石。聲明的時候函數(shù)名必須是__init__,并且保證這個方法是對象方法;
聲明后不用去調(diào)用,系統(tǒng)會自動調(diào)用
記住: a.創(chuàng)建對象的時候系統(tǒng)自動調(diào)用__init__方法
b.創(chuàng)建對象的時候鳖链,構(gòu)造函數(shù)需不需要參數(shù),需要幾個參數(shù)看__init__除了self以外有沒參數(shù)墩莫,有幾個參數(shù)
"""
class Person:
def __init__(self):
print('init方法')
p1 = Person()
p2 = Person()
class Student:
def __init__(self, name, age=10):
print('學(xué)生類的init', name, age)
# stu1 = Student() # TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'
stu2 = Student('小明', 18)
stu3 = Student(age=20, name='小花')
stu4 = Student('Tom')
四芙委、類中的屬性
1.類中的屬性 —— 就是類中保存數(shù)據(jù)的變量
類中的屬性分為2種:字段、對象屬性
2.字段
1)怎么聲明: 直接聲明在類里面函數(shù)外面的變量就是字段
2)怎么使用: 通過類使用狂秦; 以'類.字段'的形式去使用
3)什么時候用:不會因為對象不同而不一樣的屬性就聲明成對象屬性
3.對象屬性
1)怎么聲明:聲明在init方法中灌侣;以'self.屬性名=值'的形式來聲明
2)怎么使用: 通過對象來使用; 以'對象.屬性'的形式來使用
3)什么時候用: 會因為對象不同而不一樣的屬性就聲明成對象屬性
class Person:
# a就是字段
a = 10
# name和age就是對象屬性
def __init__(self):
self.name = '小明'
self.age = 18
# print(a) # NameError: name 'a' is not defined
print(Person.a)
p1 = Person()
print(p1.name, p1.age)
p2 = Person()
print(p2.name, p2.age)
p2.name = '小花'
class Student:
def __init__(self, n, s=0):
self.name = n
self.age = 18
self.score = s
stu1 = Student('小明')
print(stu1.name, stu1.age, stu1.score)
stu2 = Student('小花', 60)
print(stu2.name, stu2.age, stu2.score)
# 聲明一個狗類裂问,擁有屬性:品種侧啼、名字牛柒、顏色、年齡痊乾、性別皮壁; 功能: 吃(xxx吃xxx)
class Dog:
def __init__(self, name, bread='土狗', color='黃色', age=1, gender='公狗'):
self.breed = bread
self.name = name
self.color = color
self.age = age
self.gender = gender
def eat(self, food: str):
# self=dog1; food='肉'
print('%s在吃%s' % (self.name, food)) # self.name->dog1.name
dog1 = Dog('大黃')
dog2 = Dog('財財', color='黑色')
dog1.eat('肉')
dog2.eat('骨頭')
五、類中的方法
1.類中的方法
類中的方法有3種: 對象方法哪审、類方法蛾魄、靜態(tài)方法
1)對象方法
a.怎么聲明:直接聲明在類中的函數(shù)
b.怎么調(diào)用:通過對象來調(diào)用
c.特點:自帶一個參數(shù)self;self在調(diào)用的時候不用傳參湿滓,指向當(dāng)前對象 self -> 當(dāng)前對象
d.什么時候用:如果實現(xiàn)函數(shù)的功能需要用到對象屬性滴须,這個函數(shù)就聲明成對象方法
2)類方法
a.怎么聲明:在函數(shù)聲明前加@classmethod
b.怎么調(diào)用:通過類來調(diào)用
c.特點:自帶一個參數(shù)cls; cls在調(diào)用的時候不用傳參,系統(tǒng)會自動將當(dāng)前類傳給cls
cls -> 當(dāng)前類 (當(dāng)前類能做的事情cls都可以做)
d.什么時候用:實現(xiàn)函數(shù)的功能不需要對象屬性的前提下叽奥,需要類
3)靜態(tài)方法
a.怎么聲明:在函數(shù)聲明前加@staticmethod
b.怎么調(diào)用:通過類來調(diào)用
c.特點:沒有自帶的參數(shù)
d.什么時候用:實現(xiàn)函數(shù)的功能不需要對象屬性的前提下扔水,也不需要類
class Student:
num = 100
def __init__(self, name, tel, age=18):
self.name = name
self.age = age
self.tel = tel
# study是對象方法
def study(self):
print('%s在學(xué)習(xí)' % self.name)
@classmethod
def func1(cls):
print('cls:', cls)
print('類方法func1')
# print(num) # NameError: name 'num' is not defined
print(Student.num)
# cls可以創(chuàng)建對象
stu2 = cls('小花', '112', 20)
print('stu2:', stu2)
# cls可以使用類的字段
print(cls.num)
@staticmethod
def func2():
print('靜態(tài)方法func2')
stu = Student('小明', '110')
stu.study()
print('stu:', stu)
print('Student:', Student)
Student.func1()
Student.func2()
class Math:
pi = 3.1415926
@classmethod
def circle_area(cls, r):
return cls.pi * r * r
@staticmethod
def sum(num1, num2):
return num2 + num1
六、對象屬性的增刪改查
1.獲取屬性值
1)對象.屬性 - 獲取對象指定屬性的值
2)getattr(對象, 屬性名:str) - 獲取對象指定屬性的值
3)getattr(對象, 屬性名:str, 默認(rèn)值) - 獲取對象指定屬性的值朝氓,沒有不會報錯魔市,會獲取默認(rèn)值
2.修改屬性和增加屬性
1)對象.屬性 = 值 當(dāng)屬性存在的時候就是修改;屬性不存在的時候是增加
2)setattr(對象, 屬性名, 值) 當(dāng)屬性存在的時候就是修改膀篮;屬性不存在的時候是增加
3.刪除對象屬性
1) del 對象.屬性 - 刪除對象中指定的屬性
2) delattr(對象, 屬性名) - 刪除對象中指定的屬性
注意: 屬性的增刪改查只針對指定對象有效嘹狞,不會影響別的對象
七、內(nèi)置屬性
1. 類._ _ name _ _ - 獲取類的名字
2. 對象._ _ class _ _ - 獲取對象對應(yīng)的類(和type(對象)功能一樣)
3. 類._ _ doc _ _ - 獲取類的說明文檔
4.類._ _ dict _ _ - 獲取類中所有的字段和字段對應(yīng)的值誓竿,以字典的形式返回
5. (掌握磅网!) 對象._ _ dict _ _ - 獲取對象所有的屬性和對應(yīng)的值,以字典的形式返回
注意: 如果設(shè)置了_ _ slots _ _,對象的 _ _ dict _ _就不能用
6.類._ _ module _ _ - 獲取當(dāng)前這個類是哪個模塊中聲明的筷屡,返回的是模塊名
7.類._ _ bases _ _ - 獲取當(dāng)前類的所有的父類
object是python的基類