---------------------------------------------------------------------------------------------------------------------------------
"""
如果类中需要非该类成员存在,则可以使用静态调用的方法@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()
---------------------------------------------------------------------------------------------------------------------------------
三、列表生成式
# 列表生成式
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)
---------------------------------------------------------------------------------------------------------------------------------四、函数闭包