python静态调用@staticmethod/类方法@classmethod/继承多态/装饰器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python静态调用@staticmethod/类方法@classmethod/继承多态/装饰器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3973字,纯文字阅读大概需要6分钟。
内容图文
静态调用@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/继承多态/装饰器全部内容,希望文章能够帮你解决python静态调用@staticmethod/类方法@classmethod/继承多态/装饰器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。