python3面向对象、错误处理

面向对象

# 类定义 继承自object类
class Human(object):
    name = "Human"

    # private 属性
    __money = 100

    # 初始化实例方法
    def __init__(self, name, money):
        self.name = name
        self.__money = money
        self.sing = True

    def get_money(self):
        return self.__money

    def set_money(self, money):
        self.__money = money

    # 实例方法
    def eat(self, food):
        print(self.name, "eat", food)

    # 类方法 通过@classmethod装饰器实现,类方法中只能访问类变量,不能访问实例变量;通过cls参数传递当前类对象,不需要实例化。
    @classmethod
    def walk(cls, speed):
        print(cls.name, "walk", speed)

    # 静态方法 通过@staticmethod装饰器实现,在静态方法中无法访问类和实例中的任何属性;调用时并不需要传递类或实例。
    # 定义在类中的普通函数
    @staticmethod
    def sleep(hour):
        print(Human.name, "sleep", hour)


# 子类 继承自Human类
class Student(Human):
    name = "Student"

    # @property装饰器将一个方法变成属性使用
    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    # 限制允许绑定的属性名称,仅对当前类实例起作用,子类实例不起作用
    __slots__ = ("grade", "age")

    def eat(self, food):
        pass
        print(self.name, "eat", food)

    def drink(self, drink):
        print(self.name, "drink", drink)


# MixIn给一个类增加当前类的功能,子类可以通过多重继承来组合多个MixIn的功能,而不用设计多层次的复杂的继承关系。
class CourseNatureMixIn:
    def learn_nature(self):
        print("learn nature class")


# 多继承
class Pupil(Student, CourseNatureMixIn):
    name = "Pupil"


# 实例变量访问
m = Student("小明", 300)
print(dir(m))  # 获取实例的所有属性和方法
print(m.name, m.sing, m.get_money())  # 小明 True 300

m.birth = "2020-01-01"
print(m.birth, getattr(m, "birth"))  # 2020-01-01 2020-01-01

# 实例动态添加属性
m.age = 9
print(m.age, hasattr(m, "age"), getattr(m, "age"))  # 9 True 9
m.grade = 5
print(m.grade, hasattr(m, "grade"), getattr(m, "grade"))  # 5 True 5

print(isinstance(m, Student), isinstance(m, Human), isinstance(m, object))  # True True True
print(issubclass(Student, Human))  # True

print(hasattr(m, "eat"), hasattr(m, "name"), hasattr(m, "__money"))  # True True False
print(getattr(m, "name"), getattr(m, "age", 20))  # 小明 9
setattr(m, "name", "小青")
print(getattr(m, "name"))  # 小青


m.eat("饺子")  # 小青 eat 饺子
m.walk("很快")  # Student walk 很快
m.sleep("8小时")  # Human sleep 8小时

w = Pupil("小王", 100)
w.age = 10
print(w.age, hasattr(w, "age"), getattr(w, "age"))  # 10 True 10
w.level = 5
print(w.level, hasattr(w, "level"), getattr(w, "level"))  # 5 True 5

w.learn_nature()  # learn nature class

# 类变量访问
print(Student.name, Human.name)  # Student Human
Student.eat(m, "大米")  # 小青 eat 大米
Student.walk("很慢")  # Student walk 很慢
Student.sleep("7.5小时")  # Human sleep 7.5小时

错误处理

import logging

try:
    raise ValueError("value error")  # 抛出异常
except (ValueError, OSError) as err:  # 处理指定类型异常
    print("出现异常")
    print(err)
except:
    print("处理全部其它异常")  # 处理全部其它异常
else:
    print("没有异常发生")  # 没有异常发生
finally:
    print("必须执行")  # 必须执行的代码

# 调试方法1
try:
    a = 1
    b = 0
    print(a, b)
    x = a / b
except ZeroDivisionError as err:
    print(err)  # division by zero

# 调试方法2
try:
    a = 1
    b = 0
    assert b != 0, "b=0"  # 断言 AssertionError b=0
    x = a / b
except AssertionError as err:
    print(err)  # b=0

# 调试方法3:使用logging
# 可以指定记录信息的级别,有debug、info、warning、error等几个级别
logging.basicConfig(level=logging.INFO)
try:
    aa = 1
    bb = 0
    logging.info("bb={}".format(bb))  # INFO:root:bb=0
    x = aa / bb
except ZeroDivisionError as err:
    print(err)

 

posted @ 2023-09-08 17:09  carol2014  阅读(10)  评论(0编辑  收藏  举报