day15-面向?qū)ο?

類和對象

1.什么是類览露,什么是對象

類就是擁有相同功能和相同屬性的對象的集合 - 抽象的
對象就是類的實例 - 具體

如果人是類,余婷和駱昊就是對象
如果車是類丽惶,具體某一輛車才是對象

2.類的聲明 - 用代碼描述清楚這個類是哪些相同功能和相同屬性的集合

"""
1)語法:
class 類名:
    類的說明文檔
    類的內(nèi)容

2)說明
class - 聲明類的關(guān)鍵字
類名 - 標識符炫七,不能關(guān)鍵字夫凸,見名知義纠亚,采用駝峰式;首字母大寫
類的說明文檔 - 用""""""引起來的說明性文字
類的內(nèi)容 - 用來描述共同的功能和屬性
         主要包含方法(聲明在類中的函數(shù))和屬性(聲明在類中的變量)
"""


class Person:
    """人類"""
    def eat(self):
        print('人類吃飯')

    def sleep(self):
        print('人類睡覺')

    def thinking(self):
        print('人類思考')

3.創(chuàng)建對象

"""
語法:
類() - 創(chuàng)建類的對象并返回
"""

p1 = Person()
p2 = Person()

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 Dod:
    # eat就是對象方法
    def eat(self, food='骨頭'):
        print('self:', self)
        print('狗吃' + food)


dog1 = Dod()    # dog1就是Dog的對象
print('dog1:', dog1)
dog1.eat()

init的方法和構(gòu)造方法

1.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__方法 - 魔法方法;也是一個對象方法驶冒。聲明的時候函數(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ù)
"""


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('小明', 18)
stu2 = Student(age=20, name='小花')

類中的屬性

1.類中的屬性 - 就是類中保存數(shù)據(jù)的變量

類中的屬性分為兩種:字段着撩、對象屬性

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(Person.a)

p1 = Person()
print(p1.name, p1.age)

p2 = Person()
print(p2.name, p2.age)

print('===================================================')


class Student:
    def __init__(self, name, score=100):
        self.name = name
        self.age = 18
        self.score = score


stu1 = Student('小明')
print(stu1.name, stu1.age, stu1.score)

stu2 = Student('小花', 60)
print(stu2.name, stu2.age, stu2.score)

print('==================================================')
# 聲明一個狗類诅福,擁有屬性:品種、名字拖叙、顏色氓润、年齡、性別;吃(XXX吃XXX)


class Dog:
    def __init__(self, name, pz='土狗', color='黃色', age=1, sex='公'):
        self.pz = pz
        self.name = name
        self.color = color
        self.age = age
        self.sex = sex

    def eat(self, food):
        print('%s吃%s' % (self.name, food))


dog1 = Dog('旺財', age=3)
dog2 = Dog('小強', '二哈', '黑白')

print(dog1.pz, dog1.name, dog1.color, dog1.age, dog1.sex)
print(dog2.pz, dog2.name, dog2.color, dog2.age, dog2.sex)
dog1.eat('屎')
dog2.eat('骨頭')

類中的方法

1.類中的方法

類中的方法有三種:對象方法憋沿、類方法旺芽、靜態(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ù)的功能不需要對象屬性的前提下,需要類的時候用類方法

2)靜態(tài)方法
a.怎么聲明:在函數(shù)聲明前加@staticmethod
b.怎么調(diào)用:通過類來調(diào)用
c.特點:沒有自帶的參數(shù)
d.什么時候用:實現(xiàn)函數(shù)的功能不需要對象屬性的前提下壶辜,也不需要類的時候用靜態(tài)方法

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')

        # cls可以創(chuàng)建對象
        stu2 = cls('小花', 112, 20)
        print('stu2:', stu2)
        print(cls.num)

    @staticmethod
    def fun2():
        print('靜態(tài)方法fun2')


stu = Student('小明', '110')
stu.study()

print('Student:', Student)
Student.func1()
Student.fun2()


class Math:
    pi = 3.141592653

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

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


class Keng:
    num = 100

    def func1(self):
        print('坑中的對象方法')

    @classmethod
    def func2(cls):
        print('坑中的類方法')

    @staticmethod
    def func3():
        print('坑中的靜態(tài)方法')


# 注意:類中的所有方法都可以通過對象或者類調(diào)用
# 類調(diào)用對象方法
Keng.func1(1)  # 用類調(diào)用對象方法self會失去意義
k = Keng()
k.func2()       # 用對象調(diào)用類方法多此一舉悯舟,cls還是當(dāng)前類
k.func3()       # 同上

對象屬性的增刪改查

class Person:

    def __init__(self, name, age=18, gender='女'):
        self.name = name
        self.age = age
        self.gender = gender


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

# 1.獲取屬性的值
# 屬性的增刪改查只針對指定的對象有效,不會影響別的對象
"""
1)對象.屬性 - 獲取對象指定屬性的值
2)getattr(對象,屬性名:str) - 獲取對象指定屬性的值
3)getattr(對象,屬性名:str,默認值) - 獲取對象指定屬性的值
"""
print(p1.name)
print(getattr(p1, 'name'))
print(getattr(p1, 'aaa', '無名氏'))

# attr = input('輸入需要獲取的屬性:')
# print(getattr(p1, attr))


# 2.修改屬性和增加屬性
"""
1)對象.屬性 = 值  -  當(dāng)屬性存在的時候就是修改砸民,不存在就是增加
2)setattr(對象,屬性名,值)  -  當(dāng)屬性存在的時候就是修改抵怎,不存在就是增加
"""

# 改
p1.age = 28
print(p1.age)

setattr(p1, 'age', 30)
print(p1.age)


# 增
p1.height = 180
print(p1.height, getattr(p1, 'height'))

setattr(p1, 'weight', 70)
print(p1.weight)


# 3.刪除對象屬性
"""
1)del 對象.屬性 - 刪除對象中指定的屬性
2)delattr(對象,屬性名) - 刪除對象中指定的屬性
"""

# del p1.name
# print(p1.name)
#
# delattr(p1, 'age')
# print(p1.age)

內(nèi)置屬性

# 內(nèi)置類屬性 - 聲明類的時候系統(tǒng)提供的屬性


class Dog:
    """狗類!"""
    num = 100

    # 約束對象屬性
    # __slots__ = ('name', 'age', 'gender', 'height', 'weight')

    def __init__(self, name, age=3, gender='公狗'):
        self.name = name
        self.age = age
        self.gender = gender

    def func1(self):
        print('對象方法', self.name)

    @classmethod
    def func2(cls):
        print('類方法')

    @staticmethod
    def func3():
        print('靜態(tài)方法')


dog1 = Dog('大黃')

# 1. 類.__name__    -    獲取類的名字

print(Dog)
print(Dog.__name__)


# 2. 對象.__class__  -  獲取對象對應(yīng)的類(和type(對象)功能一樣)
print(type(dog1))
print(dog1.__class__)


# 3. 類.__doc__    -    獲取類的說明文檔
print(Dog.__doc__)


# 4. __dict__

# 類.__dict__    -    獲取類中所有字段和字段對應(yīng)的值岭参,以字典的形式返回
print(Dog.__dict__)


# 5.(掌握!) 對象.__dict__  -  獲取對象所有的屬性和對應(yīng)的值反惕,以字典形式返回
print(dog1.__dict__)

# 6.__slots__  -  用來約束當(dāng)前類最多能夠擁有的對象屬性

# 注意 __dict__和__slots__只能存在一個,不可兼得

# 7.類.__module__  -  獲取當(dāng)前這個類實在哪個模塊中聲明的,返回模塊名
print(Dog.__module__)
print(int.__module__)


# 8. 類.__bases__    -    獲取當(dāng)前類的父類

# object是python的基類
print(Dog.__bases__)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末演侯,一起剝皮案震驚了整個濱河市姿染,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秒际,老刑警劉巖悬赏,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡汉,死亡現(xiàn)場離奇詭異,居然都是意外死亡闽颇,警方通過查閱死者的電腦和手機盾戴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兵多,“玉大人尖啡,你說我怎么就攤上這事≈惺螅” “怎么了可婶?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵沿癞,是天一觀的道長援雇。 經(jīng)常有香客問我,道長椎扬,這世上最難降的妖魔是什么惫搏? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮蚕涤,結(jié)果婚禮上筐赔,老公的妹妹穿的比我還像新娘。我一直安慰自己揖铜,他們只是感情好茴丰,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著天吓,像睡著了一般贿肩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上龄寞,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天汰规,我揣著相機與錄音,去河邊找鬼物邑。 笑死溜哮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的色解。 我是一名探鬼主播茂嗓,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼科阎!你這毒婦竟也來了述吸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤萧恕,失蹤者是張志新(化名)和其女友劉穎刚梭,沒想到半個月后肠阱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡朴读,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年屹徘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衅金。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡噪伊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氮唯,到底是詐尸還是另有隱情鉴吹,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布惩琉,位于F島的核電站豆励,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞒渠。R本人自食惡果不足惜良蒸,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伍玖。 院中可真熱鬧嫩痰,春花似錦、人聲如沸窍箍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椰棘。三九已至纺棺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晰搀,已是汗流浹背五辽。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留外恕,地道東北人杆逗。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像鳞疲,于是被迫代替她去往敵國和親罪郊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

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

  • 1.什么是類尚洽,什么是對象類就是擁有相同功能和相同屬性的對象的集合悔橄;類是抽象的對象就是類的實例;對象是具體的人是類 ...
    _最美不是下雨天_閱讀 231評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了運行時來處理癣疟。這種動態(tài)語言的...
    有一種再見叫青春閱讀 577評論 0 3
  • 今天下午媽媽給我買了一個新的密碼本挣柬,他穿的一身粉紅色的衣裳,衣服上還印著一只小白兔睛挚,他嘴里還含著糖果邪蛔,還有小...
    屈炫宇閱讀 164評論 0 1
  • 文/薩胖胖 參賽編號:249 你將在那兒出現(xiàn)吧?我滿心期待地望著遠處的島洲扎狱,想象著你降臨時曼妙的身姿侧到,心中不免惆...
    薩胖胖閱讀 462評論 0 12