day13-面向?qū)ο?

1. 內(nèi)置類屬性

"""__author__ = Percy"""
"""
內(nèi)置類屬性:Python中每個(gè)類都擁有內(nèi)置的類屬性
__name__
__doc__
__dict__
__module__
__bases__
"""
class Animal:
    """動(dòng)物類"""
    pass

class Cat(Animal):
    """貓類"""
    number = 0

    def __init__(self, name='', color=''):
        self.name = name
        self.color = color

    def run(self):
        print('%s正在跑' % self.name)

    @staticmethod
    def shout():
        print('喵~')

    @classmethod
    def get_number(cls):
        print('貓的數(shù)量:%d' % cls.number)



if __name__ == '__main__':
    cat1 = Cat('小花', 'white')
    """
    1. 類.__name__
    獲取類的名字(字符串)
    """
    print(Cat.__name__)
    """
    2.類.__doc__
    獲取類的說明文檔
    """
    print(Cat.__doc__)
    """
    (重點(diǎn)) 3. 類.__dict__   獲取類中所有的類屬性和對(duì)應(yīng)的值,以鍵值對(duì)的形式存到字典中
       對(duì)象.__dict__ 將對(duì)象的屬性和對(duì)應(yīng)的值,轉(zhuǎn)換成字典的元素(常用)
    """
    print(Cat.__dict__)
    print(cat1.__dict__)
    """
    4. 類.__module__     獲取當(dāng)前類所在的模塊的名字
    """
    print(Cat.__module__)
    """
    5. 類.__bases__
    獲取當(dāng)前類的父類
    """
    print(Cat.__bases__)
運(yùn)行結(jié)果:
Cat
貓類
{'__module__': '__main__', '__doc__': '貓類', 'number': 0, '__init__': <function Cat.__init__ at 0x000001C7792DB510>, 'run': <function Cat.run at 0x000001C7792DB598>, 'shout': <staticmethod object at 0x000001C7792E34A8>, 'get_number': <classmethod object at 0x000001C7792E34E0>}
{'name': '小花', 'color': 'white'}
__main__
(<class '__main__.Animal'>,)

2. 私有化

python中類中的屬性和方法的私有化:直接在屬性名或者方法名前加__(命名以 '__' 開頭)
屬性或者方法私有:在外部不能直接使用,可以在類的內(nèi)部使用

import random

class Person:
    """人類"""
    # 私有的類字段
    __number = 10

    def __init__(self, name='', age=0):
        self.name = name
        self.__age = age

    def show_age(self):
        print('%d' % (self.__age - 10))
        self.__run()

    # 私有的對(duì)象方法,只能在類的內(nèi)部調(diào)用
    def __run(self):
        print('%s在跑' % self.name)

    # 私有的類方法(靜態(tài)也可以)
    @classmethod
    def get_number(cls):
        print(cls.__number)

class Student:
    def __init__(self, name):
        self.name = name
        self.study_id = ''

    def __creat_id(self):
        return  'py1805' + str(random.randint(1, 50)).rjust(3, '0')

    def creat(self, name):
        stu = Student(name)
        stu.study_id = self.__creat_id()
        return stu

if __name__ == '__main__':
    p1 = Person('Percy', 18)
    p1.name = 'Smile'
    print(p1.name)
    p1.show_age()

    Person.get_number()

    # 私有化原理:在內(nèi)部私有的名字前面加了前綴'__類名'
運(yùn)行結(jié)果:
Smile
8
Smile在跑
10

3. getter和setter

屬性假的私有化:聲明對(duì)象屬性的時(shí)候,在屬性名前面加一個(gè)'_',來告訴別人這個(gè)屬性不可以直接使用。
要通過getter和setter來獲取屬性的值和修改屬性的值

  1. getter:
    格式:
    @property
    def 屬性名(去掉下劃線)(self):
    return 返回值

如果在獲取對(duì)象的某個(gè)屬性前需要再干點(diǎn)別的事,就給屬性添加getter

  1. setter:給屬性賦值
    一個(gè)屬性必須要有g(shù)etter才能添加setter。
    格式:
    @屬性名(去掉下劃線).setter
    def 屬性名去掉下劃線(self, 變量名):
    給帶下劃線的屬性賦值

如果在給對(duì)象的某個(gè)屬性賦值前需要再干點(diǎn)別的事,就給屬性添加setter

class Student:
    """學(xué)生類"""
    def __init__(self):
        # 聲明屬性的時(shí)候,前面加一個(gè)'_'是為了告訴別人這個(gè)屬性不能直接使用
        self._name = ''
        self._score = 0
        self._age = 0

    # 給屬性_name添加getter
    @property
    def name(self):
        return self._name

    # 給屬性_name添加setter
    @name.setter
    def name(self, value):
        self._name = value

    # 給_score添加getter和setter
    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, score):
        self._score = score

    # 給_age添加getter和setter
    @property
    def age(self):
        return str(self._age) + '歲'

    @age.setter
    def age(self, age):
        if age >=150 or age <= 0:
            print('年齡輸入有誤')
            # # raise 拋出異常:raise 錯(cuò)誤類型
            # raise ValueError
            self._age = None
            return
        self._age = age


if __name__ == '__main__':
    stu1 = Student()

    # 不添加getter和setter
    # stu1._name = 'Percy'
    # print(stu1._name)

    # 添加getter和setter
    stu1.name = 'Smile'
    print(stu1.name)

    stu1.score = 100
    print(stu1.score)

    stu1.age = 18
    print(stu1.age)
    stu1.age = 1000
    print(stu1.age)
輸出結(jié)果:
Smile
100
18歲
年齡輸入有誤
None歲

4. 練習(xí)

"""__author__ = Percy"""
import json

def download_data():
    with open('./data.json', 'r', encoding='utf-8')as f:
        content = json.load(f)
        return content['data']

class Data:
    """數(shù)據(jù)類"""
    def __init__(self):
        self.type = ''
        self.text = ''
        self.user_id = ''
        self.name = ''
        self.screen_name = ''
        self._width = 0
        self._height = 0
        self._themes = None

    # _width的getter和setter
    @property
    def width(self):
        return self._width
    @width.setter
    def width(self, width):
        self._width = int(width)

    # _height的getter和setter
    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, height):
        self._width = int(height)

    # themes的getter
    @property
    def themes(self):
        if not self._themes:
            return '無'
        return self._themes

    # 根據(jù)字典創(chuàng)建對(duì)象
    @classmethod
    def creat_data(cls, dict1):
        data = cls()
        for key in dict1:
            # 處理特殊情況
            if key == 'width':
                data.width = dict1[key]
                continue
            if key == 'height':
                data.height = dict1[key]
                continue
            if key == 'themes':
                data._themes = dict1[key]
                continue
            data.__setattr__(key, dict1[key])
        return data

if __name__ == '__main__':
    print(download_data())
    datas = []
    for dict1 in download_data():
        # 通過字典創(chuàng)建對(duì)象
        data = Data.creat_data(dict1)
        # 將創(chuàng)建的對(duì)象存起來
        datas.append(data)

    print(datas[0].width)
[{'type': '41', 'text': '胡蘿卜造型的可愛多功能雨傘,了解一下', 'user_id': '21088861', 'name': '蒙面女俠Y', 'screen_name': '蒙面女俠Y', 'width': '360', 'height': '636', 'themes': None}, {'type': '41', 'text': '水陸兩棲,自由變換,還不快來圍觀一下嗎!', 'user_id': '15262111', 'name': '共醉江湖', 'screen_name': '共醉江湖', 'width': '1024', 'height': '576', 'themes': None}]
636

5. 類的繼承

子類:繼承者
父類(超類):被繼承者

  1. 怎么繼承
    python中類是可以繼承的,并且支持多繼承
class 類名(父類列表):
    '''類的說明文檔'''
    屬性
    方法

說明:python中所有的類默認(rèn)繼承python的基類:object

  1. 能繼承哪些內(nèi)容
    繼承:直接擁有父類的屬性和方法(繼承后父類的屬性和方法還是存在的)
    a. 對(duì)象的屬性和方法、類的字段和類方法、靜態(tài)方法都可以繼承(私有的繼承無意義 --- 不能繼承)
    b. __slots__的值不會(huì)被繼承
    c. getter和setter會(huì)被繼承
class Person:
    """人類"""
    __slots__ = ('name', 'age', 'sex', '__length', '_face')
    def __init__(self):
        self.name = ''
        self.age = 0
        self.sex = '男'
        self.__length = 0
        self._face = 0


    def eat(self):
        print('%s在吃飯' % self.name)

    number = 61

    @classmethod
    def get_number(cls):
        print('人的數(shù)量:%d' % cls.number)

    @staticmethod
    def hurt_earth():
        print('人類破壞地球')

class Student(Person):
    """學(xué)生類"""
    pass


if __name__ == '__main__':
    p1 = Person()

    stu = Student()
    stu.name = 'Percy'
    print(stu.name, stu.age, stu.sex)

    stu.eat()
    print(stu.__dict__)
    print(stu._face)

    print(Student.number)
    Student.get_number()
    Student.hurt_earth()
運(yùn)行結(jié)果:
Percy 0 男
Percy在吃飯
{}
0
61
人的數(shù)量:61
人類破壞地球
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容