python学习Day10

表现你的类:即调用对象时会自动运行的方法

__str__
__repr__

在使用__str__属性时,有几个注意事项需要牢记。
首先,__str__方法应该返回一个字符串,而不是其他类型的值。如果返回其他类型的值,将会导致TypeError。
其次,__str__方法不应该接受任何参数,即使在定义方法时声明了参数。如果在调用print()函数时传递了参数,将会导致TypeError。
最后,__str__方法应该尽量简洁明了,避免过多的复杂逻辑和计算,以保证其执行效率。
str和repr的区别
1、定义不同
str()函数得到的字符串可读性好,用于将值转化为适于人阅读的形式;
repr()函数得到的字符串通常可以用来重新获得该对象,将对象转化为供解释器读取的形式。
2、面向对象和目的不同
str()函数主要面向用户,其目的是可读性;
repr()函数面向的是python解释器,或者说开发人员,其目的是准确性。
3、返回处理方式不同
str()返回形式为用户友好性和可读性都较强的字符串类型,返回面向最终用户可读可理解的信息;
repr()返回值表示python解释器内部的含义,返回面向开发者的变量的数据内容,常作为编程人员debug用途。可以根据返回信息直接复制粘贴就可以定义一个与对应变量值相等的新变量。
4、字符串处理不同
函数str()将其转化成为适于人阅读的前端样式文本;
repr()就是原本未处理的用于编译器阅读的后台底层代码。
5、输出目的不同
str() 的输出追求明确性和可读性,输出格式要便于理解,适合用于输出内容到用户终端。
repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用。

getattr(object, name, default=None)方法可以帮助我们访问方法中的属性
object为方法,name为方法名,第三个是如果不存在该对象返回的值
在这里插入图片描述
需要注意的是,__setattr__需要小心陷入死循环,如下代码即陷入了死循环,即在__setattr__魔法函数中又使用了self.key=value,此时又会进入__setattr__魔法函数,从而陷入死循环

class trangle:
    def __init__(self,long=0,weight=0):
        self.long=long
        self.weight=weight

    def __setattr__(self, name, value):#每次对某个值进行定义时都会调用该方法,name传属性名,value传定义的值
        if name=='square':
            self.weight=value
            self.long=value
        else:
            #这个也可以self.__dict__[name]=value,这里__dict__是访问字典中这个叫做name的键,
            super().__setattr__(name,value)

    def  getArea(self):
        area=self.weight*self.long
        return area

property方法
property属性是一种用起来像是实例属性一样的特殊属性,可以对应于某个方法。

class Foo:
    def func(self):
        pass

    # 定义property属性
    @property
    def prop(self):
        pass

foo_obj = Foo()
foo_obj.func()  # 调用实例方法
foo_obj.prop  # 调用property属性

property属性的定义和调用要注意一下几点:
定义时,在实例方法的基础上添加 @property 装饰器,并且仅有一个self参数;
调用时,无需括号;
方法:foo_obj.func()
property属性:foo_obj.prop
用于定义一个特殊的属性,该属性可以像普通属性一样访问,但其值是通过方法计算得出的。它通常用于控制对类的私有属性的访问,以实现更好的封装性和安全性。
property 函数接受三个可选的参数:fgetfsetfdel,分别用于获取、设置和删除属性的值。这些方法可以是类的成员方法或静态方法。
property 的主要用途包括:
将方法转换为属性,使得类的接口更加清晰。
隐藏属性的实际实现细节,提供只读或受限制的访问。
在设置或获取属性值时执行额外的逻辑。
使用 property 的两种常见方式包括:
类属性方式:直接在类定义中使用 property(get_method, set_method) 来定义属性。这种方式适用于当获取或设置属性值时需要执行特定方法的情况。
装饰器方式:使用 @property@<attribute_name>.setter 装饰器来定义属性和其对应的设置方法。这种方式适用于当定义的方法名与属性名相同时,可以通过对象直接访问该属性。
参考:https://blog.csdn.net/qq_33681891/article/details/132428534

协议
类似于接口,它规定了那些方法必须被定义,更类似于一种指南
在这里插入图片描述
fromkeys()方法的使用
fromkeys()方法从序列键和值设置为value来创建一个新的字典。
语法:dict.fromkeys(seq[ , value])
1
参数:
seq – 这是将用于字典的键准备的值的列表
value – 这是可选的,如果提供的话则值将被设置为这个值
返回值:
此方法返回的是列表。

##设计一个可变列表,可计算其每个元素被访问次数
class CountList:
    def __init__(self,*args):
        self.values=[x for x in args]
        self.count={}.fromkeys(range(len(self.values)),0)
    def __len__(self):
        return len(self.count)
    def __getitem__(self, key):#每次被访问时对cout中的key值加一
        self.count[key]+=1
        return self.values

迭代器
iter()
容器对象调用iter()
next()
不断获取下一个对象
__iter__和__next__方法。__iter__方法返回迭代器对象自身,而__next__方法定义了迭代的逻辑。当使用for循环迭代my_iter对象时,会依次打印出0到4这五个数字。当没有更多的元素可以迭代时,StopIteration异常会被引发,结束迭代过程。
生成器
使用了 yield(产出) 的函数被称为生成器(generator)
生成器是一种特殊类型的函数,可以让您在遍历序列时不需要事先构建完整的序列。这意味着,生成器只会在每个元素被请求的时候才去生成该元素。这个过程也被称为“迭代器协议”。
您可以通过两种方式创建生成器:
1.将函数定义改为生成器函数,使用yield关键字来代替return关键字。
2.使用生成器表达式,类似于列表推导式。

斐波那契数列迭代器版

class Fabi:
    def __init__(self,n=20):
        self.a=0
        self.b=0
    def __iter__(self):
        return self#返回迭代器本身
    def __next__(self):
        self.a,self.b=self.b,self.a+self.b
        return self.a

生成器版

def fibonacci(limit):
    # 初始值
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

生成器表达式是一种更简单的创建生成器的方式。它类似于列表推导式,但返回一个生成器对象。生成器表达式的语法形式为:
(表达式 for 变量 in 序列 if 条件)
其中,表达式是生成器要返回的值,变量是一个循环变量,序列是该变量要遍历的序列,条件是可选的
个人理解:生成器多用于迭代中,在每次迭代时获取下一次需要迭代的变量

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值