Day3静态方法和类方法、继承和多态、列表生成式、函数闭包

一、静态方法和类方法

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

---------------------------------------------------------------------------------------------------------------------------------

"""
如果类中需要非该类成员存在,则可以使用静态调用的方法@staticmethod
"""

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()

---------------------------------------------------------------------------------------------------------------------------------

案例1:

输入四条边判断它是否是一个正方形,如果是:计算面积.(@staticmethod)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

和静态方法比较类似,Python还可以在类中定义类方法,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象(类本身也是一个对象,有的地方也称之为类的元数据对象),通过这个参数我们可以获取和类相关的信息并且可以创建出类的对象。

"""
@classmethod:获取自身类(cls)中的属性,并且可以更改.
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等
"""
from time import time, localtime, sleep


class Clock(object):
        """数字时钟"""

       def __init__(self, hour=0, minute=0, second=0):
             self._hour = hour
             self._minute = minute
             self._second = second

       @classmethod
       def  now(cls):
              ctime = localtime(time())
              return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)

        def run(self):
               """走字"""
              self._second += 1
              if  self._second == 60:
                    self._second = 0
                    self._minute += 1
                   if  self._minute == 60:
                         self._minute = 0
                         self._hour += 1
                        if  self._hour == 24:
                              self._hour = 0

        def show(self):
              """显示时间"""
               return '%02d:%02d:%02d' % \

                          (self._hour, self._minute, self._second)


def main():
      # 通过类方法创建对象并获取系统时间
      clock = Clock.now()
      while True:
             print(clock.show())
             sleep(1)
             clock.run()

if __name__ == '__main__':

       main()

---------------------------------------------------------------------------------------------------------------------------------

二、继承和多态

刚才我们提到了,可以在已有类的基础上创建新类,这其中的一种做法就是让一个类从另一个类那里将属性和方法直接继承下来,从而减少重复代码的编写。提供继承信息的我们称之为父类,也叫超类或基类;得到继承信息的我们称之为子类,也叫派生类或衍生类。子类除了继承父类提供的属性和方法,还可以定义自己特有的属性和方法,所以子类比父类拥有的更多的能力,在实际开发中,我们经常会用子类对象去替换掉一个父类对象,这是面向对象编程中一个常见的行为。

class A(object):
       def __init__(self):
             self.a = 100
             # self.a1 = a1

       def  A1(self):
              print('A1')

# 在类名中写上继承的类.
class B(A):
       def __init__(self):
             A.__init__(self)
            self.b = 200
            # self.b1 = b1
       """
       def __init__(self):
             self.a = 100
             # self.a1 = a1

       def A1(self):
             print('A1')
       """
       def B1(self):
             print('B1')

b_ = B()
print(b_.a)
b_.A1()

 

案例2:

创建一个父类创建一个子类,父类计算两个数字的和,记为SUM_,子类打印这个SUM_。

---------------------------------------------------------------------------------------------------------------------------------

三、列表生成式

# 列表生成式

a = (x for x in range(100000000000) if x % 2== 0)
for  i  in  range(100):
     print(next(a))

# 列表生成式

a = [x  for  x  in  range(100000000000)  if  x  %  2 == 0]
优点: 计算速度快,因为一次性已经全部加载到内存中了,适合数据量不是太大的情况10000- 2000-
缺点: 占用内存

# 生成器

a = (x for x in range(100000000000) if x % 2== 0)
优点: 节约内存空间
缺点: 计算速度慢,因为要生成.

# 装饰器

def deco(func):

​      def warp(n1,n2,n3):

​            num = n1 + n2

​            return func(0,num,n3)

​       return warp

*装饰器将前两个数字求和,函数本身第三个参数乘上这个和*

@Joker

def  SUM(num1,num2,num3):

​         print(num1,num2,num3)

        ​ print(num2 * num3)

 SUM(10,2,3)

---------------------------------------------------------------------------------------------------------------------------------四、函数闭包

 

 

转载于:https://www.cnblogs.com/WANGRUNZE/p/11322652.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值