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)