Day12-面向对象

2018-08-01  本文已影响40人  周zau1

1、内置类属性


Python中每个类都拥有内置的类属性

class Xxx:
    """说明文档"""

2、私有化


python 中类的属性和方法的私有化:直接在属性名或者方法名前加__
属性或者方法私有:在外部不能直接使用,可以在类的内部使用

3、getter 和 setter


属性假的私有化:声明对象属性的时候,在属性名前面加一个下划线,来告诉别人这个属性不可以直接使用。要通过getter 和 setter 来获取属性的值和修改属性的值

getter:获取属性的值

@property
def 属性名(去掉下划线)(self):
    return 返回值

如果在获取对象的某个属性前需要在干点别的事情,就给属性添加geter

setter:给属性赋值
一个属性必须要有getter,才能添加setter。

@属性名(去掉下划线),serer
def 属性名去掉下划线(self, 变量名):
    给带下划线的属性赋值

如果在给对象的某个属性赋值前需要在干点别的事情,就给属性添加seter

class Student:
    """学生类"""
    def __init__(self):
        # 声明属性的时候前面加一个'_' 是为了告诉别人这个属性不能直接使用
        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

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




if __name__ == '__main__':
    stu1= Student()
    # 不添加getter 和 setter
    # stu1._name = '张三'

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

4、类的继承


子类:继承者
父类(超类):被继承者

python 中类是可以继承的,并且支持多继承

class 类名(父类列表):
    '''类的说明'''
    属性
    方法

python 中所有的类默认继承python 的基类:object

继承:直接拥有父类的属性和方法(继承后父类依然有属性和方法)
a.对象的属性和方法、类的字段和类方法、静态方法都可以继承(私有的继承无意义,可以看做不能继承)
b. __ slots __ 的值不会被继承
c. getter 和 setter 会被继承

5、小练习


# Jay
import json
# 获取数据
def download_data():
    with open('./data.json', 'r', encoding='utf-8') as f:
        return json.loads(f.read())['data']

class Data:
    """数据类"""
    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._height = int(height)

    @property
    def themes(self):
        if not self._themes:
            return '无'
        return self._themes

    # 根据字典创建对象
    @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():
        # 通过字典创建对象
        data = Data.creat_data(dict1)
        # 将创建的对象存起来
        datas.append(data)
    # 取值
    print(datas[0].text)
上一篇下一篇

猜你喜欢

热点阅读