廖雪峰学习记录(第二弹)

关于装饰器,类与对象的总结(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)							

(可能你们会觉得我为什么,,不把前面序号去掉)

  1. 用来逐行解释
  2. 逼迫扶我文章的小白自己敲一遍

类与对象

类的基础知识相信大家都有了解
这里贴出链接:- 菜鸟教程
- 廖雪峰教程

类的访问限制

其中提到数据封装,数据封装用来把类内的数据实现方法隐藏起来,使得类外面调用时不知道数据怎么得来的,但是可以调用数据。
接下来说说之上加一个访问限制这里挺有意思想说说

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__的内容,而类本身并没用值的更改。

这算是我自己的一份总结日记,不全是教学的,分享给学过基础想要巩固的人们
小白的话建议看之前有看过廖雪峰老师的学习网站内容,过后用这个来复习。

文末建议大家自己去查阅不懂得内容,网上很多基础知识都是很详细的,有问题可以在评论区讨论。
另外,我才疏学浅,不喜勿喷,谢谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值