美文网首页
day_012 Python中的面对对象2

day_012 Python中的面对对象2

作者: HavenYoung | 来源:发表于2018-08-01 17:02 被阅读0次

一、内置的类属性

内置类属性:python中每个类都拥有内置额类属性
__name__
__doc__
__dict__
__module__
__bases__

class Animal:
    """动物的类"""
    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('猫的数量:%d' % cls.number)


if __name__ == '__main__':
    cat1 = Cat('花花', 'white_black')

    """
    1.类.__name__
    获取类的名字(字符串)
    """
    print(Cat.__name__)

    """
    2.类.__doc__
    获取类的说明文档
    """
    print(Cat.__doc__)

    """
    3.类.__dict__  获取类中所有的类属性和对应的值,以键值对的形式存到字典中
      对象.__dict__  获取对象中所有的对象属性和对应的值,以键值对的形式存到字典中
    """
    print(Cat.__dict__)
    print(cat1.__dict__)

    """
    4.类.__module__  获取当前类所在的模块的名字
    
    """
    print(Cat.__module__)

    """
    5.类.__bases__ 获取当前类的父类
    """
    print(Cat.__bases__)

结果:

Cat
说明文档:猫的类
{'__module__': '__main__', '__doc__': '说明文档:猫的类', 'number': 0, '__init__': <function Cat.__init__ at 0x007CD618>, 'run': <function Cat.run at 0x0BBAD738>, 'shout': <staticmethod object at 0x00EE0870>, 'get_number': <classmethod object at 0x02D79C70>}
{'name': '花花', 'color': 'white_black'}
__main__
(<class '__main__.Animal'>,)

二、私有化

  • python中类中的属性和方法的私有化:直接在属性名或者方法名前加__(命名以'__'开头)
  • 属性或者方法私有:在外部不能直接使用,可以在类的内部使用
class Person:
    """人类"""
    # 私有的类字段
    __number = 10

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

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

    # 私有的对象方法,只能在类的内部调用
    def __run(self):
        print('%s is running' % self.name)

    @classmethod
    def get_number(cls):
        # 类的内部可以调用私有化的熟悉或者方法
        print(cls.__number)


if __name__ == '__main__':
    p1 = Person('张三', 20)
    p1.name = 'joo'
    # p1.__age = 18
    # print(p1.name, p1.__age)

    p1.show_age()

    Person.get_number()

    # 私有化的原理:在内部在私有的名字前加了前缀'_类名'
    print(p1.__dict__)

结果:

20
10
{'name': 'joo', '_Person__age': 20}

三、getter 和 setter

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

  • 1.getter:获取属性的值
    @property
    def 属性名(去掉下划线)(self):
    return 返回值

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

  • 2.setter:给属性赋值
    一个属性必须要有getter才能添加setter
    @属性名(去掉下划线).setter
    def 属性名(去掉下划线)(self, 变量名):
    给带下划线的属性赋值

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

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, name):
        self._name = name

    @property
    def score(self):
        return self._score

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

    @property
    def age(self):
        return str(self._age) + '岁'

    @age.setter
    def age(self, age):
        if age >= 150 or age < 0:
            print('输入的年龄存在错误')
            # raise 抛出异常:raise 错误类型
            # raise ValueError
            self._age = None
            return

        self._age = age



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

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

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

    print(stu1.__dict__)

    stu1.score = 80
    print(stu1.score)

    stu1.age = 88
    print(stu1.age)

结果:

20
10
{'name': 'joo', '_Person__age': 20}

四、类的继承

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

1.继承基础
python中类是可以继承的,并且支持多继承

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

说明:python中所有的类默认继承object类(python的基类)

2.能继承哪些内容
继承:直接拥有父类的属性和方法(继承后父类的属性和方法依然存在)
a.对象的属性和方法,类的字段、类的方法和静态方法(私有的继承无意义---不能继承)
b.slots不会被继承
c.getter和setter会被继承

class Person:
    """人类"""
    # __slots__ = ('name', 'age', 'sex', '__height', '_face')

    def __init__(self):
        self.name = ''
        self.age = 0
        self.sex = '男'
        self.__height = 0
        self._face = 0

    def eat(self):
        print('%s:阿姆阿姆' % self.name)

    # 类的字段
    number = 66

    @classmethod
    def get_number(cls):
        print(cls.number)

    @staticmethod
    def run():
        print('running')

    @property
    def face(self):
        return self._face

    @face.setter
    def face(self, face):
        self._face = face


class Student(Person):
    """学生类"""
    pass


if __name__ == '__main__':
    stu1 = Student()
    stu1.name = 'jo'
    print(stu1.name)

    stu1.eat()
    print(stu1.number)
    stu1.get_number()
    stu1.run()
    print(stu1.__dict__)

    stu1.weight = 80
    print(stu1.weight)

    stu1.face = 50
    print(stu1.face)

结果:

jo
jo:阿姆阿姆
66
66
running
{'name': 'jo', 'age': 0, 'sex': '男', '_Person__height': 0, '_face': 0}
80
50

相关文章

  • day_012 Python中的面对对象2

    一、内置的类属性 内置类属性:python中每个类都拥有内置额类属性__name____doc____dict__...

  • Python学习1:Python对象模型

    1. 对象模型 Python中对象是所有数据的抽象。所有Python程序中的值都由对象或者对象之间的关系表示。 2...

  • Python中属性查找的顺序

    1.继承关系的查找 python2中是深度查找python3中是广度查找 2.属性的查找 对象的查找先从对象属性字...

  • 2019-10-23

    python面向对象编程总结 python中的对象:在其...

  • 2. Python3源码—浮点对象

    2.1. 浮点对象 浮点对象是“定长对象”。 2.1.1. Python中的创建 Python中浮点对象创建最重要...

  • 3. Python3源码—整数对象

    3.1. 整数对象 整数对象是“变长对象”。 3.1.1. Python中的创建 Python中整数对象最重要的创...

  • Python 类与对象

    Python 中面向对象编程的2个非常重要的概念:类和对象 对象是面向对象编程的核心,在使用对象的过程中,为了将具...

  • week2 总结 - web前端

    01.基础语法(对象) 1.什么是对象(Object) - 和Python中的对象一样,有对象属性和对象方法。 2...

  • python对象和垃圾回收

    1. python对象 python使用对象模型来存储数据,python中万物皆对象。python对象有三个特性:...

  • 1. Python3源码—内建对象

    1.1. Python内的对象 Python中的类和实例都是通过Python内的对象来实现的。Python中已经预...

网友评论

      本文标题:day_012 Python中的面对对象2

      本文链接:https://www.haomeiwen.com/subject/jjyrvftx.html