首页 > 编程语言 >Python 之面向对象

Python 之面向对象

时间:2024-09-05 14:53:28浏览次数:10  
标签:__ name Python self 面向对象 Weekday print def

__slots__

限制类的绑定属性

__str__: print打印对象,返回用户看到的字符串
__repr__:返回程序开发者看到的字符串,如直接输入变量,是为调试服务的

class Student(object):
    def __str__(self):
    return 'Student object (name: %s)' % self.name

print(Student('hell0'))

可以直接:

__repr = __str__

__iter__: 一个类用于for...in循环

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1

    def __iter__(self):
        return self
    
    def __next__(self):
        self.a, self.b = self.b, self.a+self.b
        if self.a > 100000:
            raise StopIteration()
        return self.a

for n in Fib():
    print(n)

__getitem__:Fib实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list来使用还是不行,比如,取第5个元素:

>>> Fib()[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Fib' object does not support indexing

要表现得像list那样按照下标取出元素,需要实现__getitem__()方法:

class Fib(object):
    def __getitem__(self, n):
        a, b = 1, 1
        for x in range(n):
            a, b = b, a + b
        return a

但是list有个神奇的切片方法:

>>> list(range(100))[5:10]

对于Fib却报错,原因是__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断

def __getitem__(self, n):
        if isinstance(n, int): # n是索引
            a, b = 1, 1
            for x in range(n):
                a, b = b, a + b
            return a
        if isinstance(n, slice): # n是切片
            start = n.start
            stop = n.stop
            if start is None:
                start = 0
            a, b = 1, 1
            L = []
            for x in range(stop):
                if x >= start:
                    L.append(a)
                a, b = b, a + b
            return L

但是现在没有对step参数处理f[:10:2],也没有对负数做处理
此外,如果把对象看成dict,__getitem__()的参数也可能是一个可以作key的object,例如str。
与之对应的是__setitem__()方法,把对象视作list或dict来对集合赋值。最后,还有一个__delitem__()方法,用于删除某个元素。
总之,通过上面的方法,我们自己定义的类表现得和Python自带的list、tuple、dict没什么区别,这完全归功于动态语言的“鸭子类型”,不需要强制继承某个接口。

__getattr__:动态返回一个属性。

class Student(object):

    def __init__(self):
        self.name = 'Michael'

    def __getattr__(self, attr):
        if attr=='score':
            return 99

当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score的值:
注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找

__call__:一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。

任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。请看示例

class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print('My name is %s.' % self.name)

调用方式如下:

>>> s = Student('Michael')
>>> s() # self参数不要传入
My name is Michael.

__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。

怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call__()的类实例:

>>> callable(Student())
True
>>> callable(max)
True
>>> callable([1, 2, 3])
False
>>> callable(None)
False
>>> callable('str')
False

枚举类

from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

for name, member in Month.__members__.items():
    print(name, '=>', member, ',', member.value)

value属性则是自动赋给成员的int常量,默认从1开始计数。
如果需要更精确地控制枚举类型,可以从Enum派生出自定义类:

from enum import Enum, unique

@unique
class Weekday(Enum):
    Sun = 0 # Sun的value被设定为0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6

@unique装饰器可以帮助我们检查保证没有重复值。

访问这些枚举类型可以有若干种方法:

>>> day1 = Weekday.Mon
>>> print(day1)
Weekday.Mon
>>> print(Weekday.Tue)
Weekday.Tue
>>> print(Weekday['Tue'])
Weekday.Tue
>>> print(Weekday.Tue.value)
2
>>> print(day1 == Weekday.Mon)
True
>>> print(day1 == Weekday.Tue)
False
>>> print(Weekday(1))
Weekday.Mon
>>> print(day1 == Weekday(1))
True
>>> Weekday(7)
Traceback (most recent call last):
  ...
ValueError: 7 is not a valid Weekday
>>> for name, member in Weekday.__members__.items():
...     print(name, '=>', member)
...
Sun => Weekday.Sun
Mon => Weekday.Mon
Tue => Weekday.Tue
Wed => Weekday.Wed
Thu => Weekday.Thu
Fri => Weekday.Fri
Sat => Weekday.Sat

标签:__,name,Python,self,面向对象,Weekday,print,def
From: https://blog.51cto.com/u_11365839/11928122

相关文章

  • Python如何对列表内的数字求和?
    Python列表是一种有序、可变的数据结构,可以包含不同类型的数据,如数字、字符串等。而在Python中,将列表中的数据求和是一个常见操作,那么如何对Python列表中的数字进行求和?我们通过这篇文章来介绍一下方法。Python中有几种方法可以对列表内的数字求和:1、使用内置函数......
  • 20240905_134536 python 填空题 列表
    20240905_144516python填空题字符串方法1_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1192782320240905_154516python填空题xxx20240905_164516python填空题xxx20240905_174516python填空题xxx20240905_184516python填空题xxx20240......
  • 20240905_144516 python 填空题 字符串方法1
    字符串s="hi",希望它占30个位置,居中,其它位置用!占位,结果用变量r记录r=s.center(30,"!")字符串s="abaac",需要统计s中有多少个a,把结果保存在变量i中i=s.count("a")有字符串s,需要把它转换为utf8的字节数据,把结果保存在变量b中b=s.encode()有字符串s,需要把它转换为gbk的字节......
  • Python 之pip换源
    Python修改pip源为国内源1.临时换源:#清华源pipinstallmarkdown-ihttps://pypi.tuna.tsinghua.edu.cn/simple#阿里源pipinstallmarkdown-ihttps://mirrors.aliyun.com/pypi/simple/#腾讯源pipinstallmarkdown-ihttp://mirrors.cloud.tencent.com/pypi/sim......
  • python最经典基础算法题-2
    题目006:斐波那契数列程序分析:斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。【思路】:很多种解法,我是按照分割的方式,每次取列表后两项,然后相加。l=[0,1]foriinrange(10):arr=l[-2:]l.append(arr[0]+arr[1])print(l)题目007:将一......
  • 【Python入门】教你安装2024最新的Python,最新版全面教程!!!
    2024安装Python的详细教程一、准备工作确定Python版本:访问Python官网(WelcometoPython.org),查看最新的稳定版本。在撰写本文时(2024年9月),Python3.x是当前的主要版本,其中3.10.x或3.11.x是较新的稳定版本。注意选择与你操作系统(Windows、macOS、Linux)相匹配的版本。下......
  • 【Python基础】学好Python的基本要求,就是了解Python的优点和缺点。看完你就知道了!!!
    Python作为一种广泛使用的高级编程语言,确实拥有许多优点,同时也存在一些缺点。以下是对Python优缺点的详细概述:优点简单易学:Python的语法清晰简洁,阅读性好,容易上手,是初学者学习编程的理想选择。丰富的库和框架:Python拥有庞大的标准库和第三方库,几乎覆盖了所有常见的编程任......
  • 【Python基础】一篇文章带你了解Python能够运用到哪些场景当中!!!
    Python作为一种功能强大且灵活的高级编程语言,具有广泛的应用场景。以下是Python的一些主要应用场景:1.Web应用开发Web框架:Python提供了多个强大的Web开发框架,如Django、Flask、Pyramid和Tornado等。这些框架可以帮助开发者快速构建Web应用程序,并提供了丰富的功能和工具,如模板......
  • Python 之SQLAlchemy
    目录SQLAlchemy简明教程表的设计¶常见操作¶常见查询操作¶常见删除操作¶常见更新操作¶常见插入操作¶常见连表查询¶数据库migration¶SQLAlchemy简明教程SQLAlchemy是Python中常用的一个ORM,SQLAlchemy分成三部分:ORM,就是我们用类来表示数据库schema的那部分SQLAlchemyCo......
  • 【小白深度教程 1.5】手把手教你用立体匹配进行双目深度估计,以及 3D 点云生成(含 Pytho
    【小白深度教程1.5】手把手教你用立体匹配进行双目深度估计,以及3D点云生成(含Python代码解读)1.立体匹配的原理2.块匹配算法(BlockMatchingAlgorithm)2.1代码中的立体匹配过程概述2.2代码原理及公式2.2.1.窗口匹配和代价函数(SAD)2.2.2.匹配过程2.2.3.......