类与对象复习

一、绑定方法与非绑定方法

类中定义的函数我们称为方法,方法分为两类

  • 绑定方法

    • 绑定到对象的方法 在类内直接使用定义的函数就是绑定给对象的方法.对象使用时会把自己当成第一个参数传入

      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))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值