私有变量、继承和多态、实例属性和类属性、__slots__、装饰器、多重继承、__str__()、枚举类、logging模块

本文探讨了面向对象编程中的核心概念,包括私有变量的使用、继承和多态的应用、实例与类属性的区别,以及高级特性如动态属性、装饰器限制属性、多重继承、魔法方法和枚举类。还介绍了如何通过logging模块捕获并处理错误。
摘要由CSDN通过智能技术生成

面向对象

1、私有变量(双下划线,外部不可访问)

在这里插入图片描述
(单下划线,虽然可以访问,但希望你不要访问)
在这里插入图片描述

2、继承和多态

在这里插入图片描述
在这里插入图片描述

多态:对父类方法 重写,在外部定义函数调用时
在这里插入图片描述

3、实例属性和类属性

在这里插入图片描述
在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

4、面向对象高级特性

1)可以随时添加对象属性和方法

class Student:
    pass


def run(self):
    print("i am running")


s = Student()


# 绑定一个类方法
Student.run = run
s.age = 12

2)限制实例的属性

在这里插入图片描述

装饰器

在这里插入图片描述

# 函数装饰器练习:装饰器可以用来设置一些属性问题,因为
# 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

class Student:
    def __init__(self, name, score):
        self.name = name
        self.__score = score

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

    @score.setter
    def score(self, score):
        if not isinstance(score, int):
            raise ValueError('score must be an integer!')
        elif score < 0 or score > 100:
            raise ValueError('score must between 0 ~ 100!')
        self.__score = score


if __name__ == '__main__':
    s = Student('Orange', 80)
    print(s.score)
    s.score = 90
    print(s.score)

在这里插入图片描述

多重继承

通过多重继承,一个子类就可以同时获得多个父类的所有功能。

在这里插入图片描述

class MyUDPServer(UDPServer, ThreadingMixIn):
    pass

在这里插入图片描述

魔法方法

在这里插入图片描述
限制实例的属性
在这里插入图片描述

枚举类

枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期、月份、状态等。

@unique # 加上unique表示不允许成员值相同
from enum import Enum
class Color(Enum):
    red = 1
    green = 2
    blue = 3

枚举类型不可实例化,不可更改。
枚举类

捕获错误栈的同时,让程序运行下去(logging模块)

err_logging.py

import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        logging.exception(e)

main()
print('END')

在这里插入图片描述
捕获错误,并向上一级抛出
t

try:
    10 / 0
except ZeroDivisionError:
    print("Error")
    # 捕获了,但是处理不了,所以继续向上一级抛出
    raise ValueError('input error!')

如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,用raise语句抛出一个错误的实例:

# err_raise.py
class FooError(ValueError):
    pass

def foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value: %s' % s)
    return 10 / n

foo('0')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellobigorange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值