记录学习过程中遇到的新知识点
1、定义python类时要不要加括号?
在 Python2 中,对 object 的继承需要显式地写为 FrenchDeck(object);
而在 Python 3 中,这个继承关系是默认的,所以可加可不加,加的话object可写可不写。
2、类的属性
与python变量类似,不用显式的说明对象有哪些属性,赋值时会自动创建。
3、信息隐藏
对于复杂的抽象,信息隐藏的意义很重要,有些语言为此设置了专门的机制,python内部没有没有服务于这种需求的机制,只能靠一些编程约定。例如:
3.1 以下划线开头的属性或者方法都当做内部使用,不应该在类外调用。
3.2 以双下划线开头,但不以两个下划线结尾的名字做了特殊处理,使得类外不可调用。
4、静态方法
与定义的类没有本质的联系,但是可以为该类服务,参数列表不应该有self,函数需加修饰符@staticmethod。
5、特殊方法
如果类需要定义特殊方法,例如+、-、*、/等运算,需要在类中采用特殊方法名,例如__add__(self, other)、sub、mul、mod、floordiv、truediv
Druediv:就是/浮点除法
Floordiv:就是//整除运算符
补充:
1、比较大小的关系特殊方法:
相等:_eq_、_ne_
大于:_gt_、_ge_
小于:_lt_、_le_
2:转化为字符串输出,这样在类外使用print函数时候,会自动调用该特殊方法。
def _str_(self):
Print(‘—’)
6、实例代码
class Rational():
"""有理数类进阶"""
def __init__(self, num, den=1):
if not isinstance(num, int) or not isinstance(den, int):
raise TypeError
if den == 0:
raise ZeroDivisionError
sign = 1
if num < 0:
sign, num = -sign, -num
if den < 0:
sign, den = -sign, -den
g = Rational._gcd(num, den) # 求最大公约数
self._num = sign * (num // g)
self._den = (den // g)
@staticmethod # 为这个类服务,但是实际上和这个类无关的方法
def _gcd(m, n): # 求最大公约数的算法
if n == 0:
n, m = m, n
while m != 0:
m, n = n % m, m
return n
def num(self): return self._num
def den(self): return self._den
def __add__(self, other): # other 相当于处在类外,按照约定不要直接访问其属性,而是通过接口
"""定义加法运算的例子,其他运算类似"""
if isinstance(other, Rational):
num = self._num * other.den() + self._den * other.num()
den = self._den * other.den()
return Rational(num, den)
else:
raise TypeError
def __gt__(self, other):
"""定义比较大小的例子,其他关系可以类似定义"""
return self._num * other.den() > self._den * other.num()
def __str__(self):
return str(self._num) + '/' + str(self._den)
a = Rational(3, 4)
b = Rational(4, 5)
if __name__ == '__main__':
print(a + b)
print(a > b)
print(Rational._gcd(5, 10))
输出:
31/20
False
5
小结:类中在init中定义属性,接下来定义相关的方法,访问属性给出接口,输出采用str特殊方法。就是下面迭代过程:定义与访问、运算与输出。
# 结束,加油、加油、加油。
萧人 发布了20 篇原创文章 · 获赞 0 · 访问量 677 私信 关注