一、绑定方法与非绑定方法
类中定义的函数我们称为方法,方法分为两类
-
绑定方法
-
绑定到对象的方法 在类内直接使用定义的函数就是绑定给对象的方法.对象使用时会把自己当成第一个参数传入
class Foo: def __init__(self, name): self.name = name # 绑定给对象的方法 def tell(self, n): print(self, n) print(self.name) # f.name f = Foo('123') f.tell(10)
-
绑定给类的方法 就是给类来调用的 类和对象来调用的时候 会把类当成第一次参数传入
class Foo: def __init__(self, name): self.name = name # 绑定给对象的方法 def tell(self, n): print(self, n) print(self.name) # f.name @classmethod # 绑定给类的方法 def func(cls): print(cls)
-
-
非绑定方法
-
不与类与对象绑定 也就是说没有自动传值了 就是一个普通的函数 类和对象都可以使用
class Foo: def __init__(self, name): self.name = name # 绑定给对象的方法 def tell(self, n): print(self, n) print(self.name) # f.name @classmethod # 绑定给类的方法 def func(cls): print(cls) @staticmethod # 非绑定方法 不管是类来调用还是对象来调用 都不会自动传值 就是一个普通函数 def func1(x, y): print(x + y)
-
根据方法里面的逻辑来想我们应该使用什么方法
class People(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
self.id = self.creat_id()
def tell_info(self):
print(f"姓名: {self.name} 年龄:{self.age} 性别:{self.sex}")
@classmethod
def from_conf(cls):
obj = cls(settings.name, settings.age, settings.sex)
return obj
@staticmethod
def creat_id():
m = hashlib.md5(str(time.time()).encode('utf-8'))
return m.hexdigest()
# p1 = People(settings.name, settings.age, settings.sex)
p1 = People.from_conf()
print(p1.id)
二、异常处理
异常是错误的发生信号 一旦你的程序出错 而且你没有处理这个异常的话 你的程序就会终止
错误分为两种:
-
语法错误 没有处理的必要 你应该先把语法学会再写的代码 SyntaxError
-
逻辑错误
# ValueError num = input('>>>>') # 假设你输入的是hello int(num)
# TypeError 1 + '2' IndexError : 索引超出序列的限制 NameError: 没有定义的名字使用了 AttributeError: 属性不存在
错误发生的条件如果是可以预知的 这个时候我们可以使用if去预防异常
num = input('>>>>') # 假设你输入的是hello
if num.isdigit():
num = int(num)
发生的错误是不可预知的这个时候我们就可以使用异常机制
l1 = [1, 2, 3]
iter1 = l1.__iter__()
while True:
try:
print(iter1.__next__())
except StopIteration:
print('取完了')
break
语法形式
try:
你要检测的代码
except 异常的类型:
检测到异常的时候 就执行这个里面的代码
try:
print(x)
l = [1, 2, 3]
l[50]
except NameError:
print('出现的名字错误')
except IndexError as e:
print(e)
s1 = '18是'
try:
int(s1)
except IndexError as e:
print(e)
except ValueError as e:
print(e)
else:
print('try内的代码没有异常的话 执行我')
finally:
print('不管异常是不是存在 都是执行 清理工作')
主动触发异常
name = input('>>>')
if name == '二狗子':
raise TypeError('二狗子不得入内')
class guying_error(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise guying_error('二狗子')
except guying_error as e:
print(e)
assert 断言
info = {}
info["name"] = '孤影'
info["age"] = 18
if info['name'] == '孤影' and info['age'] > 10:
print('hello')
info = {}
info["name"] = '孤影'
info["age"] = 18
assert ('name' in info) and ('age' in info)
if info['name'] == '孤影' and info['age'] > 10:
print('hello')
三、重写魔法方法补充(了解)
# 单例: 在某个系统里面一个类的对象只有一个
class Sun(object):
"""
思路: 创建类的时刻只有一次
如果是第一次创建对象 直接创建
如果不是第一次创建对象 返回之前创建的那个
"""
__instance = None
def __new__(cls):
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
sun1 = Sun()
sun2 = Sun()
print(id(sun1))
print(id(sun2))