python静态调用@staticmethod/类方法@classmethod/继承多态/装饰器

静态调用@staticmethod

  • 案例:定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法
    思路:传入三个参数,判断三条边能否构成一个三角形,计算周长与面积。但传入三条边判断是否能够成三角形这一步不是对象方法,原因是在调用这个方法时三角形未被创建(三条边能否构建三角形未知),所以这个方法属于三角形类而不属于三角形对象。
    故使用静态方法实现:

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

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 = 4,5,6
    //静态方法和类方法都是通过给类发消息来调用的
    if triangle.is_valid(a,b,c):
        t = triangle(a,b,c)
        print(t.perimeter())
        //也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
        #print(triangle.perimeter())
        print(t.area())
        #print(triangle.area(t))
    else:
        print('无法构成三角形')

if __name__ == '__main__':
    main()

私有变量不可继承

类方法

  • 类方法第一个参数约定名为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

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

class B(A):
    def __init__(self):
        A.__init__(self)
        #这里的A.__init__(self)相当于走了一次class A
        #继承:B从A那里继承了他的属性,也可由有自己的属性
        self.b = 200
        

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

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

私有变量不可继承
想调用:1、使用访问器 2、找真名

创建虚拟环境

  • cmd中安装conda
    conda create --name env_name python=3.7
    //安装python
    conda activate env_name
    //启动
    conda deactave
    //关闭
    conda env list
    //查看安装的环境
    pip freeze
    //查看自己安装的包,不包括python自带的包
    conda env remove --name env_name
    //删除包

解耦和

在一个test内写config配置文件
被class调用时,如需改变统一配置,在test中统一修改即可

列表生成式列表生成器

  • 列表生成式
a = [x for x in range(100)]
print(a) 

可以使用if函数,但不能使用else

  • 生成器
a = (x for x in range(100000000) if x % 2 == 0)
for i in range(100):
   print(next(a))
  • 优缺点:
  • 生成式:
    优点: 计算速度快,因为一次性已经全部加载到内存中了,适合数据量不是太大的情况10000- 2000-
    缺点: 占用内存
  • 生成器:
    优点: 节约内存空间
    缺点: 计算速度慢,因为要生成

import os

import os
path = '地址‘
res = os.lisdir(path)
print(res)
genter = (dir_ for dir_ in res)

返回所有文件,改成生成器

装饰器

def foo():
	def bar():
		def bar2():
			return 'hello'
		return bar2
	return bar

f1 = foo()
print(fi)
f2 = f1()
print(f2())
#结果:hello
def deco(func):
    print('HELLO1')
    def warp():
        print('HELLO')
        return func()
    return warp

@deco
def Joker():
    print('hello')

Joker()
#结果:HELLO1 HELLO hello
def foo():
	l = []
	def bar(i):
		l.append(i)
		return l
	return bar

fi = foo()
res1 = f1(1)
print(res1)
def Joker(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)
#结果:0 12 3
#36

你可能感兴趣的:(python静态调用@staticmethod/类方法@classmethod/继承多态/装饰器)