欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python- 面向对象编程概要(类、对象、派生、继承、方法、内置函数等 (1)-自定义类)

最编程 2024-05-18 11:57:54
...

特殊方法

以下图片来自《python核心编程》

__init__和__new__的区别

接下来就介绍几个常用的

限制实例变量

实例/对象添加变量一节中,我们随意添加了实例的一个变量,这体现了动态语言的特性。如果我们不想让实例随意添加变量呢?我们可以使用__slots__属性,类似于白名单。

class StudentMinIn:
    __slots__ = ('grade',)

    def __init__(self):
        self.grade = 90

    def get_grade(self):
        return self.grade


s = StudentMinIn()
s.grade = 90
s.weight = 77
print(s.weight)

结果:

Traceback (most recent call last):
  File “learnoop.py”, line 123, in
    s.weight = 77
AttributeError: ‘StudentMinIn’ object has no attribute ‘weight’

注意:要想一个类的属性受__slots__限制,那么这个类的所有父类必须得写__slots__。

打印(类似Java toString)

__str__()与__repr__(),类似于Java中的toString方法

print(s)

结果:

<__main__.StudentMinIn object at 0x000002183A859A38>

这是不是有点难看呀?作为一个干净卫生的小仙男,我们拒绝!!!

def __str__(self):
    return f'StudengMinIn grade:{self.grade}'

结果:

StudengMinIn grade:90

__repr__()是调试时用的,一般与__str__一样。直接赋值就好:

__repr__ = __str__

迭代

__iter__()与__next__()

如果你想要你的类的实例可以像List,Tuple这样类的实例一样可迭代,就可以使用这两个函数。

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1  # 初始化两个计数器a,b

    def __iter__(self):
        return self  # 实例本身就是迭代对象,故返回自己

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b  # 计算下一个值
        if self.a > 10:  # 退出循环的条件
            raise StopIteration()
        return self.a  # 返回下一个值


f = Fib()
for i in f:
    print(i)

结果:

1
1
2
3
5
8

下标获取

如果你想要你的类的对象可以像List、Tuple的对象一样,通过[]获取。那么你可以实现__getitem__()

def __getitem__(self, n):
    a, b = 1, 1
    for x in range(n):
        a, b = b, a + b
    return a
print(f[5])

结果:

8

属性的获取与设置(类似于Java的getter和setter)

自定义函数

我们可以定义get和set方法来进行属性的获取与设置。例如:

def get_grade(self):
    return self.grade

def set_grade(self, grade):
    self.grade = grade
__getattr__与__setattr__

当属性没有找到时,会报AttributeError。因为Python没有从__getattr__()中找到,我们可以覆盖这个方法。与之对应的是使用__setattr__()来进行赋值。

def __getattr__(self, attr):
    if attr == 'age':
        return 25
    raise AttributeError(f"'StudentMinIn' object has no attribute {attr}")

结果:

25
Traceback (most recent call last):
  File “learnoop.py”, line 135, in
    print(s.weight)
  File “learnoop.py”, line 125, in __getattr__
    raise AttributeError(f"‘StudentMinIn’ object has no attribute {attr}")
AttributeError: ‘StudentMinIn’ object has no attribute weight

所以,属性白名单除了__slot__里面的,还有__getattr__函数中的。

def __setattr__(self, key, value):
    if value < 60:
        self.__dict__[key] = '不及格'
    else:
        self.__dict__[key] = '及格'

s.grade = 59

print(s.grade)

注意,你需要修改或注释掉__slots__和__getattr__,否则会报AttributeError,因为我们使用了属性__dict__

结果:

不及格

调用

一个对象也可以被调用,我们需要覆盖方法__call__

def __call__(self, *args, **kwargs):
    print(f'老师给我打分:{self.grade} ')
s.grade = 59
print(callable(s))
s()

结果:

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

推荐阅读