15總 類(lèi)和對(duì)象

復(fù)習(xí)

1.類(lèi):擁有相同屬性和相同功能的對(duì)象的集合(抽象)
屬性 -> 存儲(chǔ)數(shù)據(jù)(對(duì)象屬性,類(lèi)的字段)
功能 -> 方法(對(duì)象方法,類(lèi)方法和靜態(tài)方法)

class 類(lèi)名(父類(lèi)):
類(lèi)的內(nèi)容

2.對(duì)象: 類(lèi)的實(shí)例(具體)
對(duì)象 = 類(lèi)名()

3.構(gòu)造方法和init方法
構(gòu)造方法: 聲明類(lèi)的時(shí)候,系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)函數(shù),這個(gè)函數(shù)的函數(shù)名和類(lèi)名一樣。這個(gè)方法就是構(gòu)造方法。
構(gòu)造的作用就是創(chuàng)建對(duì)象,并且自動(dòng)的去調(diào)用init方法

init方法:a.系統(tǒng)在創(chuàng)建對(duì)象的時(shí)候自動(dòng)調(diào)用。
b.可以有除了self以外的其他參數(shù),如果要給這些參數(shù)傳參,需要使用構(gòu)造方法來(lái)傳
c.需要給類(lèi)添加對(duì)象屬性
"""

class Person:
num = 1

def __init__(self, name, age):
    print(self)
    print('aaaaa')

偽代碼

def Person():

obj = malloc(4)

obj.init()

return obj

構(gòu)造方法給init方法傳參的原理

def dog_init(name, age, sex):

print(name, age, sex)

def Dog(*args, **kwargs):

dog_init(*args, **kwargs)

Dog('abc', 23, sex='男')

p2 = Person('小明', 18)
p1 = Person('小紅', 20)

print(p1)

"""
4.對(duì)象方法: 直接聲明在類(lèi)中的函數(shù)就是對(duì)象方法,有默認(rèn)參數(shù)self,并且要通過(guò)對(duì)象,調(diào)用的時(shí)候不用給self傳參
對(duì)象.對(duì)象方法,系統(tǒng)會(huì)將前面的對(duì)象傳遞給對(duì)象方法中的self
"""
class Person:
num = 1

def __init__(self, name, age):
    print(self)
    print('aaaaa')
    self.name = name

def eat(self):
    # self = p1
    print(self.name)
    print('%s吃飯' % self.name)

p1 = Person('小明', 18)

p1.eat()

p2 = Person('小紅', 20)
p2.eat()

"""
5.對(duì)象的屬性
a.聲明在init方法中
b.self.屬性 = 值

要通過(guò)對(duì)象去使用(增刪改查)

6.類(lèi)的字段(類(lèi)的屬性)
聲明在類(lèi)中,函數(shù)的外面的變量;通過(guò)類(lèi)來(lái)使用(不管在哪兒用)

7.對(duì)象.dict
"""
class Person:
num = 61

def __init__(self, name, age=10, sex='男'):
    self.name = name
    self.age = age
    self.sex = sex

p1 = Person('小明')
p2 = Person('小紅', 18)
p3 = Person('小花', 18, '女')

class Point:
def init(self, x, y):
self.x = x
self.y = y

def sum(self, num):
    sum11 = self.x + self.y + num
    return sum11

p1 = Point(10, 20)
print(p1.sum(10))

2.作業(yè):"""author = 余婷"""

1. 聲明一個(gè)電腦類(lèi)

屬性:品牌、顏色、內(nèi)存大小

方法:打游戲、寫(xiě)代碼、看視頻

a.創(chuàng)建電腦類(lèi)的對(duì)象,然后通過(guò)對(duì)象點(diǎn)的方式獲取、修改、添加和刪除它的屬性

b.通過(guò)attr相關(guān)方法去獲取、修改、添加和刪除它的屬性

class Computer:
def init(self, brand, color, ram):
self.brand = brand
self.color = color
self.ram = ram

def play_game(self):
    print('玩兒連連看~')

def coding(self):
    print('寫(xiě)python代碼')

def watch_video(self):
    print('看片兒')

cp1 = Computer('蘋(píng)果', '銀色', 256)

print(cp1.brand)
print(getattr(cp1, 'brand', '惠普'))

cp1.price = 10000
setattr(cp1, 'price', 5000)

cp1.color = '黑色'
setattr(cp1, 'color', 5000)

del cp1.ram
delattr(cp1, 'color')

2.聲明一個(gè)人的類(lèi)和狗的類(lèi):

狗的屬性:名字、顏色、年齡

狗的 法:叫喚

人的屬性:名字、 年齡、狗

人的方法:遛狗

a.創(chuàng)建人的對(duì)象名字叫小明,讓他擁有一條狗 ,然后讓小明去遛狗

class Dog:
def init(self, name, color, age):
self.name = name
self.color = color
self.age = age

def shout(self):
    print('嗷嗷叫~')

class Person:
def init(self, name: str, age: int):
self.name = name
self.age = age
self.dog = None # 注意:dog屬性的類(lèi)型應(yīng)該是Dog

def took_the_dog(self):
    if self.dog:
        print('%s正牽著%s在散步' % (self.name, self.dog.name))
    else:
        print('沒(méi)有??,遛自己!')

def beat(self):
    if not self.dog:
        print('沒(méi)有??!')
        return
    print('%s在打自己的??' % self.name)
    self.dog.shout()

創(chuàng)建人的對(duì)象

p1 = Person('小明', 18)

創(chuàng)建狗的對(duì)象

dog = Dog('大黃', '黃色', 3)

讓人擁有狗

p1.dog = dog

讓人去遛狗

p1.took_the_dog()
p1.beat()

3.聲明一個(gè)矩形類(lèi):

屬性: 長(zhǎng)、寬

方法:計(jì)算周長(zhǎng)和面積

a.創(chuàng)建不同的矩形,并且打印其周長(zhǎng)和面積

class Rect:
def init(self, length, width):
self.length = length
self.width = width

def perimeter(self):
    return (self.length + self.width)*2

def area(self):
    return self.length * self.width

rect1 = Rect(3, 2)
print(rect1.perimeter(), rect1.area())

rect2 = Rect(4, 5)
print(rect2.perimeter(), rect2.area())

4.創(chuàng)建一個(gè)學(xué)生類(lèi):

屬性:姓名,年齡,學(xué)號(hào),成績(jī)

方法:答到,展示學(xué)生信息

創(chuàng)建一個(gè)班級(jí)類(lèi): 屬性:學(xué)生, 班級(jí)名

方法:添加學(xué)生,刪除學(xué)生,點(diǎn)名, 獲取班級(jí)中所有學(xué)生的平均值, 獲取班級(jí)中成績(jī)最好的學(xué)生

class Student:
def init(self, name='', age=0, score=0, study_id=''):
self.name = name
self.age = age
self.study_id = study_id
self.score = score

def replied(self):
    print('%s,到!' % self.name)

def show_message(self):
    print(self.__dict__)

import random

class Class:
# 類(lèi)字段
__creat_id = ('python'+str(x).rjust(3, '0') for x in range(1, 101))

def __init__(self, name):
    self.students = []
    self.name = name

# 添加學(xué)生
def add_student(self):
    # 輸入學(xué)生信息
    name = input('姓名:')
    age = int(input('年齡:'))
    id = next(Class.__creat_id)
    score = random.randint(0, 100)
    # 創(chuàng)建學(xué)生對(duì)象
    stu = Student(name, age, score, id)
    self.students.append(stu)
    print(self.students)
    print('添加成功:')
    stu.show_message()

# 刪除學(xué)生
def del_student(self):
    del_name = input('姓名:')
    count = len(self.students)   # 刪除前學(xué)生的個(gè)數(shù)

    for stu in self.students.copy():
        if stu.name == del_name:
            self.students.remove(stu)

    if count == len(self.students):
        print('沒(méi)有該學(xué)生!')

def call(self):
    for stu in self.students:
        print(stu)
        # 學(xué)生答到
        stu.replied()

def average_score(self):
    scores = 0
    for stu in self.students:
        scores += stu.score

    return scores/len(self.students)

def most_excellent_student(self):
    return max(self.students, key=lambda stu: stu.score)

class1 = Class('python1807')
class1.call()

class1.add_student()

3.類(lèi)和靜態(tài)方法:

"""author = 余婷"""

"""
類(lèi)中方法:對(duì)象方法、類(lèi)方法和靜態(tài)方法

1.對(duì)象方法:
a.直接聲明在類(lèi)中
b.自帶參數(shù)self
c.通過(guò)對(duì)象來(lái)調(diào)用

2.類(lèi)方法:
a.聲明在@classmethod后面的函數(shù)就是類(lèi)方法
b.自帶參數(shù)cls(cls在函數(shù)調(diào)用的時(shí)候不用傳參,系統(tǒng)會(huì)自動(dòng)將調(diào)用這個(gè)方法的類(lèi)賦給它)
c.通過(guò)類(lèi)來(lái)調(diào)用

3.靜態(tài)方法:
a.聲明在@staticmethod后面的函數(shù)就是靜態(tài)方法
b.沒(méi)有自帶的參數(shù)
c.通過(guò)類(lèi)來(lái)調(diào)用

4.怎么選擇使用哪種方法(重點(diǎn)!):
對(duì)象方法:如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象的屬性,那么就把這個(gè)函數(shù)聲明成對(duì)象方法
靜態(tài)方法和類(lèi)方法:實(shí)現(xiàn)函數(shù)的功能不需要用到對(duì)象的屬性,就可以選擇用靜態(tài)方法或者類(lèi)方法
類(lèi)方法:在不使用對(duì)象屬性的前提下,需要使用類(lèi)
靜態(tài)方法:既不需要對(duì)象的屬性也不需要類(lèi)
"""

class Number:
def init(self):
self.value = 0
self.type = int
self.id = None

@staticmethod
def max():
    return 100

@staticmethod
def min():
    return -100

num = Number()
num.value = 1000
print(Number.max())

class Math:
pi = 3.1415926

@classmethod
def circle_area(cls,radius):
    return cls.pi * radius ** 2

@staticmethod
def sum(num1, num2):
    return num1 + num2

print(Math.circle_area(3))
print(Math.circle_area(4))

class Rect:
def init(self, length, width):
self.length = length
self.width = width

def area(self):
    return self.length * self.width

class Person:
num = 61
# 聲明一個(gè)類(lèi)方法
@classmethod
def destroy(cls):
# cls指向的是當(dāng)前類(lèi)。調(diào)用這個(gè)方法的類(lèi)可以做的事情,cls都能做
print('cls:',cls, cls.num)
p2 = cls()
print(p2)
print('人類(lèi)破壞環(huán)境')

# 聲明一個(gè)靜態(tài)方法
@staticmethod
def func1():
    print(Person.num)
    p3 = Person()
    print(p3)
    print('人類(lèi)的靜態(tài)方法')

4.私有化:

"""author = 余婷"""

"""
類(lèi)中方法:對(duì)象方法、類(lèi)方法和靜態(tài)方法

1.對(duì)象方法:
a.直接聲明在類(lèi)中
b.自帶參數(shù)self
c.通過(guò)對(duì)象來(lái)調(diào)用

2.類(lèi)方法:
a.聲明在@classmethod后面的函數(shù)就是類(lèi)方法
b.自帶參數(shù)cls(cls在函數(shù)調(diào)用的時(shí)候不用傳參,系統(tǒng)會(huì)自動(dòng)將調(diào)用這個(gè)方法的類(lèi)賦給它)
c.通過(guò)類(lèi)來(lái)調(diào)用

3.靜態(tài)方法:
a.聲明在@staticmethod后面的函數(shù)就是靜態(tài)方法
b.沒(méi)有自帶的參數(shù)
c.通過(guò)類(lèi)來(lái)調(diào)用

4.怎么選擇使用哪種方法(重點(diǎn)!):
對(duì)象方法:如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象的屬性,那么就把這個(gè)函數(shù)聲明成對(duì)象方法
靜態(tài)方法和類(lèi)方法:實(shí)現(xiàn)函數(shù)的功能不需要用到對(duì)象的屬性,就可以選擇用靜態(tài)方法或者類(lèi)方法
類(lèi)方法:在不使用對(duì)象屬性的前提下,需要使用類(lèi)
靜態(tài)方法:既不需要對(duì)象的屬性也不需要類(lèi)
"""

class Number:
def init(self):
self.value = 0
self.type = int
self.id = None

@staticmethod
def max():
    return 100

@staticmethod
def min():
    return -100

num = Number()
num.value = 1000
print(Number.max())

class Math:
pi = 3.1415926

@classmethod
def circle_area(cls,radius):
    return cls.pi * radius ** 2

@staticmethod
def sum(num1, num2):
    return num1 + num2

print(Math.circle_area(3))
print(Math.circle_area(4))

class Rect:
def init(self, length, width):
self.length = length
self.width = width

def area(self):
    return self.length * self.width

class Person:
num = 61
# 聲明一個(gè)類(lèi)方法
@classmethod
def destroy(cls):
# cls指向的是當(dāng)前類(lèi)。調(diào)用這個(gè)方法的類(lèi)可以做的事情,cls都能做
print('cls:',cls, cls.num)
p2 = cls()
print(p2)
print('人類(lèi)破壞環(huán)境')

# 聲明一個(gè)靜態(tài)方法
@staticmethod
def func1():
    print(Person.num)
    p3 = Person()
    print(p3)
    print('人類(lèi)的靜態(tài)方法')

"""author = 余婷"""

"""
1.什么時(shí)候需要添加對(duì)象屬性的getter和setter
如果希望在通過(guò)對(duì)象.屬性獲取屬性的值之前,再干點(diǎn)兒別的事情,就可以給這個(gè)屬性添加getter。
如果希望在通過(guò)對(duì)象.屬性給屬性賦值之前,再干點(diǎn)兒別的事情,就可以給這個(gè)屬性添加setter

2.怎么添加setter和getter
getter:
a.在屬性名前加_
b.添加屬性對(duì)應(yīng)的getter
@property
def 屬性名去掉_(self):
函數(shù)體 --> 會(huì)對(duì)屬性的值進(jìn)行處理后,返回相應(yīng)的結(jié)果(必須要有返回值)

c.使用屬性的值的時(shí)候,不通過(guò)帶下劃線(xiàn)的屬性名去使用,而是通過(guò)沒(méi)有下劃線(xiàn)的屬性去使用

注意:對(duì)象.不帶下劃線(xiàn)的屬性 --> 調(diào)用getter對(duì)應(yīng)的函數(shù)

setter:
如果想要添加setter必須要先添加getter
a.添加setter
@getter名.setter
def 屬性名去掉_(self, 參數(shù)):
做別的事情
self.屬性名 = 處理后的值

"""

賦值時(shí)要求age的值只能在0-150之間,超過(guò)范圍報(bào)錯(cuò);獲取age的值的時(shí)候,返回年齡值,并且返回這個(gè)年齡對(duì)應(yīng)的階段

class Person:

def init(self):

self.name

self.age = 18

print(p1.age) --> (18, 成年)

value, jieduan = p1.age value -> 18, jieduan -> 成年

class Number:
def init(self):
self._value = 0
# 0-6保存
self._week = 3
self.type = int
self.id = None

# _value添加getter和setter
@property
def value(self):
    return self._value

@value.setter
def value(self, x):
    if not -100 <= x <= 100:
        raise ValueError
    self._value = x




# _week的getter
@property
def week(self):
    if self._week == 0:
        return '星期天'
    elif self._week == 1:
        return '星期一'
    elif self._week == 2:
        return '星期二'
    elif self._week == 3:
        return '星期三'
    elif self._week == 4:
        return '星期四'
    elif self._week == 5:
        return '星期五'
    elif self._week == 6:
        return '星期六'

"""
isinstance(值, 類(lèi)) --> 判斷指定的值是否是指定類(lèi)型(返回值是bool)
"""
@week.setter
def week(self, value):
    # 如果傳的值不是整型數(shù)據(jù)
    if not isinstance(value, int):
        raise ValueError
    if not 0 <= value <= 6:
        raise ValueError

    self._week = value

number = Number()
number.value = 99
print(number.week) # number.week 實(shí)質(zhì)是在通過(guò)number去調(diào)用getter對(duì)應(yīng)的week方法
number.week = 1 # number.week = 值 實(shí)質(zhì)是通過(guò)number去調(diào)用setter對(duì)應(yīng)的week方法

number.value = 100
print(number.value)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,691評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,974評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評(píng)論 6 413
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,026評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,193評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,255評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,592評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,394評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容