关于装饰器,类与对象的总结(review)
装饰器
装饰器顾名思义就是装饰用的,理解为附加的一些功能,和普通函数一同食用,味道更佳哦
下面列出实例进行分析
1. import functools
2. def suv(fn): #定义一个闭包函数
3. @functools.wraps(fn) #对原函数被覆盖上的名字还原
4. def cout(*a,**b): #定义包内函数用来起装饰器的作用
5. if isinstance(a,tuple): #不同输入的类型得到不同结果
6. map(prnt(a),a)
7. elif isinstance(a,int):
8. print(a)
9. return fn(*a,**b) #记得一定要返回被修饰的函数值,原函数没有作用了
10. return cout
11. @suv #等同lam = suv(lam)
12. def lam(*a):
13. sum_res = 0
14. for i in a:
15. sum_res += i
16. return sum_res
17. lam(1,2,3)
(可能你们会觉得我为什么,,不把前面序号去掉)
- 用来逐行解释
- 逼迫扶我文章的小白自己敲一遍
类与对象
类的基础知识相信大家都有了解
这里贴出链接:- 菜鸟教程
- 廖雪峰教程
类的访问限制
其中提到数据封装,数据封装用来把类内的数据实现方法隐藏起来,使得类外面调用时不知道数据怎么得来的,但是可以调用数据。
接下来说说之上加一个访问限制这里挺有意思想说说
class Student(object):
def __init__(self, name, score): #用来绑定默认属性以及它们的初值
self.__name = name #Student的name属性
self.__score = score #Student的score属性
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
我们看到定义属性时用了双下杠 __
,比如self.__name,这样的话在外部直接调就会出现问题
>>> A = Student('Kang',99)
>>> A.__name
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
A.__name
AttributeError: 'Student' object has no attribute '__name'
很明显结果报错了,说明self.__name这个属性外部不可以调用即private
类,但是真的一点办法都没有吗?
>>> class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
def get_attr(self):
return self.__name,self.__score
>>> A = Student('Kang',99)
>>> A.get_attr()
('Kang', 99)
看明白了吗?
就是用 魔法打败魔法 ,想在外埠调用那就得里应外合了,类内部需要定义一个返回函数属性弄出来。
类的实例属性与类属性的差别
话说白了,就是一个用self.attr
来定义一个直接在类中定义,另一个直接在类的子录下写
class Student(object):
name = 'Student' #类属性Student.name
------------------------我是分割线--------------------------------
class Student(object):
def __init__(self,name='Kang',score = '90'):
self._name = name #类的实例对象self,实例属性self._name与self._name
self._score = score # '_' 代表“我是私有属性不要访问我”的意思类似于告示的意思
#实际上是能够用self._name的方式访问的
附上一个例题
来源:廖雪峰
统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加:
class Student(object):
count = 0
def __init__(self, name):
self.name = name
Student.count += 1
# 测试:
if Student.count != 0:
print('测试失败!')
else:
bart = Student('Bart')
if Student.count != 1:
print('测试失败!')
else:
lisa = Student('Bart')
if Student.count != 2:
print('测试失败!')
else:
print('Students:', Student.count)
print('测试通过!')
也就是说类的属性是一个类似全局变量的形式,每次给类新建对象时意味着会默认执行__init__
的内容,而类本身并没用值的更改。
这算是我自己的一份总结日记,不全是教学的,分享给学过基础想要巩固的人们
小白的话建议看之前有看过廖雪峰老师的学习网站内容,过后用这个来复习。
文末建议大家自己去查阅不懂得内容,网上很多基础知识都是很详细的,有问题可以在评论区讨论。
另外,我才疏学浅,不喜勿喷,谢谢。