类的继承

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的继承相关的知识,希望对你有一定的参考价值。

一.静态方法

@classmethod:

之前,我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息。实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题,代码如下所示。

from math import sqrt
class Triangle(object):

    def __init__(self, a, b, c):
        self._a = a
        self._b = b
        self._c = c

    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b

    def perimeter(self):
        return self._a + self._b + self._c

    def area(self):
        half = self.perimeter() / 2
        return sqrt(half * (half - self._a) *
                    (half - self._b) * (half - self._c))

        def main():
    a, b, c = 3, 4, 5
    # 静态方法和类方法都是通过给类发消息来调用的
    if Triangle.is_valid(a, b, c):
        t = Triangle(a, b, c)
        print(t.perimeter())
        # 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
        # print(Triangle.perimeter(t))
        print(t.area())
        # print(Triangle.area(t))
    else:
        print(‘无法构成三角形.‘)

if __name__ == ‘__main__‘:
    main()

参数默认值:
def A(li=‘joker‘):
print(li)

A()-----输出结果:joker 默认值
A(100)-----输出结果:100

时间戳:从1970年1月1日00.00.00秒开始到现在经历过的秒速


@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

二.类方法

@classmethod:获取自身类

技术图片


三.列表生成式与生成器

列表生成式:
优点:计算速度快,因为一次性已经全部加载到内存中了,适合数据量不是太大的情况1000-2000-
缺点:占用内存
技术图片
生成器:
把中括号改成圆括号
优点:不占用内存


四.装饰器

装饰器 decorator
或者称为包装器,是对函数的一种包装。
它能使函数的功能得到扩充,而同时不用修改函数本身的代码。
它能够增加函数执行前、执行后的行为,而不需对调用函数的代码做任何改变。
下面用一个简单的例子介绍装饰器:

1 # 函数hello,输出 hello + name 的字符串 
2     def hello(name):
3     return ‘hello ‘ + name 

技术图片


五.带参数闭包

例:
技术图片

以上是关于类的继承的主要内容,如果未能解决你的问题,请参考以下文章

简述在类的继承关系中,子类可以继承父类的都有哪些成员

子类可以继承父类的啥

子类可以继承父类的啥

请教C++高手: 关于类的继承,当子类以public方式继承基类之后,根据继承的规则,基类的所有数据成员和成

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?

类的继承