【数据结构】01-Python类

记录学习过程中遇到的新知识点

1、定义python类时要不要加括号?

在 Python2 中,对 object 的继承需要显式地写为 FrenchDeck(object);
而在 Python 3 中,这个继承关系是默认的,所以可加可不加,加的话object可写可不写。

2、类的属性

与python变量类似,不用显式的说明对象有哪些属性,赋值时会自动创建。

3、信息隐藏

对于复杂的抽象,信息隐藏的意义很重要,有些语言为此设置了专门的机制,python内部没有没有服务于这种需求的机制,只能靠一些编程约定。例如:
3.1 以下划线开头的属性或者方法都当做内部使用,不应该在类外调用。
3.2 以双下划线开头,但不以两个下划线结尾的名字做了特殊处理,使得类外不可调用。

4、静态方法

与定义的类没有本质的联系,但是可以为该类服务,参数列表不应该有self,函数需加修饰符@staticmethod。

5、特殊方法

如果类需要定义特殊方法,例如+、-、*、/等运算,需要在类中采用特殊方法名,例如__add__(self, other)、submulmodfloordivtruediv
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 · 访问量 676

猜你喜欢

转载自blog.csdn.net/weixin_43522964/article/details/104551792