day13-面向對象

1.編程思想:

1.1編程思想

  1. 面向過程編碼 - 邏輯,算法
    遇到問題,考慮直接把邏輯思維轉換成代碼,解決問題

2.函數(shù)式編程 - 函數(shù)
遇到問題晋被,就考慮是否有一個這種功能的函數(shù)

3.面向對象編程 - 類和對象
遇到問題泥兰,就考慮是否有一個對象能夠幫我解決這個問題

num = 10
num2 = 20
# print(num2 + num)
# def yt_sum():

1.2.類和對象

1.定義
類: 就是擁有相同屬性和相同功能的對象的集合(類是抽象的)
對象: 類的實例(對象是具體的)

2.從生活的角度考類的對象
如果是人是一個類燃领, 余婷是一個對象, 駱老師也是一個對象
如果電腦是一個類, 我桌上的這臺電腦就是一個對象

2. 類的聲明

語法:
class 類名(父類列表):
類的內容

說明:
class - 聲明類的關鍵字
類名 - 標識符招盲,不能是關鍵字(要求溃肪!);
采用駝峰式命名损俭,并且首字母大寫;
見名知義
(父類列表) - 繼承語法;可以省略亿汞,省略的時候相當于(objct)
類的內容 - 主要包含屬性和方法

補:駝峰式命名:名字由多個單詞組成蔫耽,通過單詞首字母大寫來區(qū)分不同的單詞
studentName
userName
userId
方法:聲明在類中函數(shù)就是方法

  1. 屬性和方法
    類中的屬性 - 指的是在類中聲明的變量;分為類的字段和對象屬性
    類中的方法 - 指的是在類中聲明的函數(shù)留夜;分為對象方法匙铡,類方法和靜態(tài)方法
# 聲明了一個Person類
class Person:
    """人類"""
    # 屬性
    num = 61

    # 方法
    def eat(self):
        print('人在吃飯!')


# Person是類(類就是類型)
print(Person)

3.創(chuàng)建對象
類名() --> 創(chuàng)建類對應的對象

# 創(chuàng)建Person類的對象xiao_ming
xiao_ming = Person()
print(xiao_ming)

3.對象方法

3.1什么是對象方法

直接聲明在類中,并且自帶一個叫self的參數(shù)的函數(shù)

3.2.對象方法的調用 - 通過對象調用對象方法

對象.對象方法()

3.3.self (當前對象)

通過對象調用對象方法的時候碍粥,對象方法中的第一個參數(shù)self不用傳參鳖眼,
系統(tǒng)會自動將當前對象傳給self。
哪個對象調用的嚼摩,self就指向誰钦讳。

注意:當前類的對象能做的事情,self都能夠做

# 聲明Person類
class Person:
    """人類"""

    # 聲明了一個對象方法sleep
    def sleep(self, a):
        # self = p1, a = 10
        print('self:', self)
        print('睡覺!', a)
        self.run()

    def run(self):
        # self=p1
        print('跑')


#  創(chuàng)建Person的對象p1
p1 = Person()
print('p1:', p1)
p1.sleep(10)

4.__init方法和構造方法

4.0魔法方法

python類中枕面,用開頭并且是結尾的方法愿卒,就是魔法方法。
魔法方法不需要主動調用潮秘,都是自動調用的

4.1.init方法

a.是對象方法
b.不需要自己調用琼开,會被自動調用
c.專門用來對對象進行初始化的

4.2.構造方法

概念:函數(shù)名和類名一樣的函數(shù),就是構造方法
當我們創(chuàng)建類的時候枕荞,系統(tǒng)會自動創(chuàng)建這個類的構造方法柜候,用來創(chuàng)建對象。
當我們通過構造方法創(chuàng)建對象的時候躏精,系統(tǒng)會自動調用init方法來對創(chuàng)建好的對象進行初始化

注意:當init方法中除了self以外如果需要別的參數(shù)渣刷,那么這些參數(shù)是通過構造方法來傳的參
只要調用了構造方法,就會產生新的對象矗烛。(想要對象辅柴,調用構造方法)

class Person(object):
    def __init__(self, name, age=0):
        print('self', self)
        print('init方法', name)

"""
def Person(*args, **kwargs):
    在堆中開辟空間創(chuàng)建對象
    對象.__init__(*args, **kwargs)
    return 對象
"""
p0 = Person('abc', 10)

p1 = Person('abc', 10)
print('p1:', p1)


p2 = Person('123', age=20)
print('p2:', p2)
# p3 = Person()
p3 = p1


# 模擬構造方法和init方法
def __init__(a, b):
    print('自己實現(xiàn)', a, b)


def Person1(*args, **kwargs):
    # args = (10, 20)
    print('創(chuàng)建對象')
    __init__(*args, **kwargs)

    print('返回對象')


Person1(10, 20)

5.對象屬性

5.1什么是對象屬性

a.聲明在init方法中
b.self.屬性名 = 值
c.通過對象使用: 對象.屬性

語法:
self.變量名 = 值

說明:變量名就是屬性名, 這個變量就是對象屬性

5.2.什么樣的屬性應該聲明稱為對象屬性

如果屬性的值會因為對象不同而不一樣,那這樣的屬性就應該聲明成對象屬性。反之就聲明稱類的字段

情況一:所有對象屬性創(chuàng)建的時候都使用一個固定的默認值

class Person:
    def __init__(self):
        # 這兒的name和age就是Person類的對象屬性
        self.name = '張三'
        self.age = 0
# 創(chuàng)建對象
p1 = Person()

# 使用對象屬性
print(p1.name)
p1.name = '李四'
print(p1.name)

p2 = Person()
p2.name = '小紅'
print(p2.name, p1.name)

情況二:創(chuàng)建對象的時候碌嘀,決定對象屬性的值

class Person:
    def __init__(self, name1, age=1):
        self.name = name1
        self.age = age


p11 = Person('小紅')
p12 = Person('小花', 0)
print(p11.age, p12.age)  # 1 0
print(p11.name, p12.name)  # 小紅  小花

# 修改對象屬性的值
p11.name = '老王'
print(p11.name)

練習:聲明一個矩形類

屬性: 長和寬
方法: 求面積和求周長

class Rect:
    def __init__(self, length1, width1):
        self.length = length1
        self.width = width1

    # 一個對象方法需不需要除了self以外的其他參數(shù)涣旨,
    # 看實現(xiàn)這個函數(shù)的功能需不需要除了屬性以外的其他數(shù)據(jù)
    def area(self):
        # self = r1
        return self.length * self.width

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


r1 = Rect(10, 20)
print(r1.area())

r2 = Rect(3, 4)
print(r2.area())

練習:聲明一個Point類,擁有屬性x坐標和y坐標筏餐。功能:求兩個點之間的距離

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

    # 求當前點到另外一個點的距離
    def distance(self, other):
        """
        求兩個點的距離
        :param other: Point對象
        :return: 距離
        """
        # self = p1  other = p2
        return ((self.x - other.x)**2 + (self.y - other.y)**2)**0.5


# 創(chuàng)建點p1
p1 = Point(0, 0)
print(p1.x, p1.y)
# 創(chuàng)建點p2
p2 = Point(3, 4)

# 求p1到p2的距離
print(p1.distance(p2))

6. 對象屬性的增刪改查

6.1.查(獲取對象屬性的值)

獲取指定對象指定屬性的值
a.對象.屬性 - 屬性不存在的時候會報錯
b.getattr(對象, 屬性名, 默認值) - 屬性不存在的時候开泽,如果設置了默認值,程序不崩潰魁瞪,而是返回默認值

print(dog1.name)
# print(dog1.name1)  # AttributeError: 'Dog' object has no attribute 'name1'

print(getattr(dog1, 'color'))
print(getattr(dog1, 'name1', None))

6.2.增穆律、改

a.對象.屬性 = 值
b.setattr(對象, 屬性名, 值)

注意:屬性存在的時候,對應的功能是修改屬性的值导俘。當屬性不存在的時候是添加屬性

dog1.name = '大黃'    # 修改
print(dog1.name)

dog1.sex = '公'    # 添加
print(dog1.sex)

setattr(dog1, 'name', '熱狗')  # 修改
print(dog1.name)

setattr(dog1, 'name2', '肉狗')  # 添加
print(dog1.name2)

6.3.刪除

a. del 對象.屬性
b. delattr(對象, 屬性名)

del dog1.name
# print(dog1.name)    # AttributeError: 'Dog' object has no attribute 'name'

delattr(dog1, 'color')
# print(dog1.color)  # AttributeError: 'Dog' object has no attribute 'color'

注意: 對象屬性的增刪改查峦耘,都是針對指定的那一個對象,不會影響其他對象

6.4.slots魔法

slots是用來約束當前這個類有哪些對象屬性

class Student:
    # Student類的對象只能有name,study_id,age和sex屬性
    __slots__ = ('name', 'study_id', 'age', 'sex')

    def __init__(self, name, age):
        self.name = name
        self.study_id = '001'
        self.age = age
        # self.sex = ''


stu1 = Student('夏明', 18)
# stu1.neme = '小明'
stu1.sex = '男'

7.類的字段和內置類屬性

7.1類的字段

a.直接聲明在類里面旅薄,函數(shù)的外面的變量就是類的字段
b.類的字段需要通過類來使用: 類.字段 - (不管是在類里面還是類的外面都一樣)

不會因為對象不同而不一樣的數(shù)據(jù)就聲明成類的字段

class Person:
    # 聲明了一個字段number
    number = 61

    def show_number(self):
        print('人類的數(shù)量:%d' % Person.number)


print(Person.number)
Person().show_number()

7. 2.內置類屬性

內置屬性就是聲明類的時候辅髓,類中已經聲明好的屬性(包含類的字段和對象的屬性)

class Dog:
    """說明文檔:狗類"""
    # 類的字段
    type = '犬科'

    # 對象屬性
    def __init__(self, name='', age=0, color=''):
        self.name = name
        self.age = age
        self.color = color

    # 對象方法
    def eat(self, food):
        print('%s在吃%s' % (self.name, food))

    # 類方法
    @classmethod
    def shout(cls):
        print('汪汪汪~~~~')

    # 靜態(tài)方法
    @staticmethod
    def bite():
        print('狗咬人!I倭骸洛口!')

a.name

類.name - 獲取類的名字(字符串)

class_name = Person.__name__
print(class_name, type(class_name))

# with open(Person.__name__+'.json', 'w') as f:
#     pass

# b.__class__

b.class

對象.class - 獲取對象對應的類(結果是一個類,原來類能做的事情它都可以做)

aa = dog1.__class__

d1 = Dog()
d2 = aa()
print(d1, d2)

print(Dog.type)
print(aa.type)

print(dog1.__class__.__name__)   # 獲取對象對應的類的名字

c.dict

(了解)類.dict - 獲取當前類的所有的類的字段及其對對應的值
(重點)對象.dict - 將當前對象所有的對象屬性及其值轉換成字典,key是屬性名,value是屬性的值

print(Dog.__dict__)
print(dog1.__dict__)

d.base

類.bases - 獲取當前類的父類(以元祖的形式返回凯沪,元祖中的元素就是類的父類)

e.module

類.module - 獲取當前類所在的模塊的模塊名

f.__doc

類.doc - 獲取類的說明文檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末第焰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妨马,更是在濱河造成了極大的恐慌挺举,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烘跺,死亡現(xiàn)場離奇詭異湘纵,居然都是意外死亡,警方通過查閱死者的電腦和手機滤淳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門梧喷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娇钱,你說我怎么就攤上這事伤柄。” “怎么了文搂?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秤朗。 經常有香客問我煤蹭,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任硝皂,我火速辦了婚禮常挚,結果婚禮上,老公的妹妹穿的比我還像新娘稽物。我一直安慰自己奄毡,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布贝或。 她就那樣靜靜地躺著吼过,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咪奖。 梳的紋絲不亂的頭發(fā)上盗忱,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音羊赵,去河邊找鬼趟佃。 笑死,一個胖子當著我的面吹牛昧捷,可吹牛的內容都是我干的闲昭。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼靡挥,長吁一口氣:“原來是場噩夢啊……” “哼序矩!你這毒婦竟也來了?” 一聲冷哼從身側響起芹血,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤贮泞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幔烛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啃擦,經...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年饿悬,在試婚紗的時候發(fā)現(xiàn)自己被綠了令蛉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡狡恬,死狀恐怖珠叔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情弟劲,我是刑警寧澤祷安,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站兔乞,受9級特大地震影響汇鞭,放射性物質發(fā)生泄漏凉唐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一霍骄、第九天 我趴在偏房一處隱蔽的房頂上張望台囱。 院中可真熱鬧,春花似錦读整、人聲如沸簿训。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽强品。三九已至,卻和暖如春车伞,著一層夾襖步出監(jiān)牢的瞬間择懂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工另玖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留困曙,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓谦去,卻偏偏與公主長得像慷丽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳄哭,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內容