python9

  1. 理解Python中的if name == ‘main
  2. 位于脚本顶层目录的模块不能使用相对导入:脚本执行的位置,如果在顶层的目录,
  3. 什么时候相对导入,什么时候绝对导入

python9复习

  1. 传入参数报错,检查实参和形参是否一致
  2. Python中类可以简化成两种:可以实例化对象的类,实例化结果后的类
  3. Python中对象名要大写,变量名要有意义,初始化函数要传入参数self,所有要用到this的都要传入参数色self
  4. Python继承:类名后面要添加继承的父类对象名,使用**super()**调用父类方法,若要覆盖父类的方法,要保证函数名和父类保持一致,Python不能用两个相同的类名
class A():
	pass
class B(A):
	pass
  1. Python封装:不去依赖语言封装
    1.任何以单下划线_开头的名字都应该是内部实现。同样适用于模块名和模块级别函数
    2.使用双下划线__开始会导致访问名称变成其他形式
    3.单下划线后缀解决和关键字冲突
  2. 创建可管理的属性
    class Duck():
    	def __init__(self, input_name):
    	self.hidden_name = input_name
    	def get_name(self):
    	print('inside the getter')
    	return self.hidden_name
    	def set_name(self, input_name):
    	print('inside the setter')
    	self.hidden_name = input_name
    	name = property(get_name, set_name)
    fowl = Duck('Howard')
    fowl.name//虽然name是内置属性,但可以直接访问了,默认的去调用了get方法
    inside the getter
    'Howard'
    
##并不是很懂的一段文字
在实现一个property的时候,底层数据(如果有的话)仍然需要存储在某个地方。因此,在
**getter**和**setter**方法中,你会看到对`_firse_name`的操作,这也是实际数据保存的地方。另
外,你可能还会问为什么`__init__()`方法中设置了`self.first_name`而不是`self._first_name`。在
这个例子中,创建一个property的目的就是在设置attribute的时候进行检查。因此,你可能想在初
始化的时候也进行这种类型检查。通过设置`self.first_name`,自动调用**setter**方法,这个方法
里面会进行参数的检查,否则就是直接访问`self._first_name`了。
注意:不要写没有做任何其他额外操作的property。//意思就是这个装饰器只能干这件事吗?????
(当然除了下面要说的)

property还可以存储计算值结果

class Circle():
	def __init__(self, radius):
		self.radius = radius
		@property
		def diameter(self):
		return 2 * self.radius
//创建一个 Circle 对象,并给 radius 赋予一个初值:
c = Circle(5)
c.radius
//5
//可以像访问特性(例如 radius )一样访问属性 diameter :
c.diameter
//10
//真正有趣的还在后面。我们可以随时改变 radius 特性的值,计算属性 diameter 会自动根
据新的值更新自己:
c.radius = 7
c.diameter
//14
依旧不是很懂的一句话
使用 property 还有一个巨大的优势:如果你改变了某个特性的定义,
只需要在类定义里修改相关代码即可,不需要在每一处调用修改。
  1. 如果你想访问类属性就用 类名.属性名或者cls.属性名??不知道这样理解对不对,静态方法甚至可以不用创建任何的实例化对象就可以调用这个方法
  2. 鸭子类型:如果它像鸭子一样走路,像鸭子一样叫,那么它就是一只鸭子。可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例,而不在于它是否显示的实现或者继承
  3. 魔术方法:方法名用特定的格式,内部实现不变,使用的时候更加干净便捷.__str__方法可以让输出更加好看,若想漂亮的打印可通过return后加东西弄出来
  4. 组合:is-a相似关系,有的地方不一样,可以用继承来实现,has-a包含关系(尾巴是鸭子的一部分)is-a常用于组合形式将一个对象传入另一个对象进行操作
  5. 命名元祖:
    由于 Guido 刚刚提到了命名元组(named tuple),那么我们就在这里谈一谈关于它的事情。
    命名元组是元组的子类,你既可以通过名称(使用 .name )来访问其中的值,也可以通过
    位置进行访问(使用 [offset] )。
    我们来把前面例子中的 Duck 类改写成命名元组,简洁起见,把 bill 和 tail 当作简单的字
    符串特性而不当作类。我们可以通过将下面两个参数传入 namedtuple 函数来创建命名元组:
    • 名称;
    • 由多个域名组成的字符串,各个域名之间由空格隔开。
    命名元组并不是 Python 自动支持的类型,使用之前需要加载与其相关的模块,下面例子中
    124 | 第 6 章的第一行就是在进行模块加载工作:

from collections import namedtuple
Duck = namedtuple(‘Duck’, ‘bill tail’)
duck = Duck(‘wide orange’, ‘long’)
duck
Duck(bill=‘wide orange’, tail=‘long’)

duck.bill
‘wide orange’

duck.tail
‘long’
也可以用字典来构造一个命名元组:

parts = {‘bill’: ‘wide orange’, ‘tail’: ‘long’}
duck2 = Duck(**parts)
duck2
Duck(bill=‘wide orange’, tail=‘long’)
注意,上面例子中的 **parts ,它是个关键词变量(keyword argument)
。它的作用是将 parts
字典中的键和值抽取出来作为参数提供给 Duck() 使用。它与下面这行代码的功能一样:

duck2 = Duck(bill = ‘wide orange’, tail = ‘long’)
命名元组是不可变的,但你可以替换其中某些域的值并返回一个新的命名元组:

duck3 = duck2._replace(tail=‘magnificent’, bill=‘crushing’)
duck3
Duck(bill=‘crushing’, tail=‘magnificent’)
假设我们把 duck 定义为字典:

duck_dict = {‘bill’: ‘wide orange’, ‘tail’: ‘long’}
duck_dict
{‘tail’: ‘long’, ‘bill’: ‘wide orange’}
可以向字典里添加新的域(键值对):

duck_dict[‘color’] = ‘green’
duck_dict
{‘color’: ‘green’, ‘tail’: ‘long’, ‘bill’: ‘wide orange’}
但无法对命名元组这么做:

duck.color = ‘green’
Traceback (most recent call last):
File “”, line 1, in
AttributeError: ‘dict’ object has no attribute ‘color’
作为总结,我列出了一些使用命名元组的好处:




它无论看起来还是使用起来都和不可变对象非常相似;
与使用对象相比,使用命名元组在时间和空间上效率更高;
可以使用点号( . )对特性进行访问,而不需要使用字典风格的方括号;
可以把它作为字典的键。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值