class Fuc(object):
@staticmethod
def get_num(m, n):
if m > n:
return m
else:
return n
def __init__(self, m, n):
self.a = self.get_num(m, n)
self.b = self.a*2
result = Fuc(5, 6)
print(result.a, result.b)
输出结果为 6 12
上面这个程序是定义一个比大小的类,里面的get_num函数是一个静态方法,不需要将第一个参数设置为self,在内部与外部都可以直接调用。
4.Python的类方法(@classmethod),这种方法必须有一个表示其调用类的参数,习惯用cls作为参数名,还可以有任何多个其他参数。类方法也是类对象的属性,通常用类方法实现与本类的所有对象有关的操作。
(举个栗子)
class Fuc(object):
count = 0
@classmethod
def count_num(cls):
return Fuc.count
@staticmethod
def get_num(m, n):
if m > n:
return m
else:
return n
def __init__(self, m, n):
self.a = self.get_num(m, n)
self.b = self.a*2
Fuc.count += 1
result1 = Fuc(5, 6)
result2 = Fuc(7, 8)
result3 = Fuc(9, 10)
print(Fuc.count_num())
输出结果为 3
还是原来的程序,在class里多定义了一个类方法,来记录该类被调用的次数,count_num函数对属性count进行操作。
5.类的继承之super()函数,如果在一个方法函数的定义里出现super().m(…)这种调用语句,执行到这个语句时,Python解释器就会从这个对象所属类的积累开始,用属性检索规则查找函数m。
(举个栗子)
class A(object):
def __init__(self):
print("A被调用了")
def a(self):
print("a被使用了")
class B(A):
def b(self):
print("b被使用了")
def __init__(self):
super().a()
print("B被调用了")
class C(B):
def c(self):
print("c被使用了")
def __init__(self):
super().a()
super().b()
self.c()
print("C被调用了")
a = A()
b = B()
c = C()
输出结果为
A被调用了
a被使用了
B被调用了
a被使用了
b被使用了
c被使用了
C被调用了
class Time(object):
def __init__(self, hours, minutes, seconds):
if hours < 24:
self.hour = hours
if minutes < 60:
self.minute = minutes
if seconds < 60:
self.second = seconds
def hours(self):
try:
return self.hour
except AttributeError:
return "输入hours有误,请小于24时"
def minutes(self):
try:
return self.minute
except AttributeError:
return "输入minutes有误,请小于60分"
def seconds(self):
try:
return self.second
except AttributeError:
return "输入seconds有误,请小于60秒"
def __add__(self, other):
new_second = self.second + other.second
new_minute = self.minute + other.minute
new_hour = self.hour + other.hour
if new_second >= 60:
new_minute += 1
new_second = 0
if new_minute >= 60:
new_hour += 1
new_minute = 0
if new_hour >= 24:
new_hour = 0
return new_hour, new_minute, new_second
def __sub__(self, other):
new_second = self.second - other.second
new_minute = self.minute - other.minute
new_hour = self.hour - other.hour
if new_second < 0:
new_minute -= 1
new_second = new_second + 60
if new_minute < 0:
new_hour -= 1
new_minute = new_minute + 60
if new_hour < 0:
new_hour = new_hour + 24
return new_hour, new_minute, new_second
def __eq__(self, other):
if (self.second == other.second) and (self.minute == other.minute) and (self.hour == other.hour):
return True
return False
def __lt__(self, other):
if self.hour < other.hour:
return True
elif (self.hour == other.hour) and (self.minute < other.minute):
return True
elif (self.hour == other.hour) and (self.minute == other.minute) and (self.second < other.second):
return True
else:
return False
t1 = Time(21, 59, 52)
t2 = Time(11, 30, 30)
print(t1.hours(), t1.minutes(), t1.seconds(), sep="\n")
print(t1 - t2)
print(t2 - t1)
print(t1 < t2)
print(t2 < t1)
print(t1 == t2)
2. 请定义一个类,实现本章描述的Date抽象数据类型。
"""
这里Date里简略的将每个月都视为30天,一年为360天
"""
class Date(object):
def __init__(self, year=2018, month=10, day=5):
self.year = year
self.month = month
self.day = day
if self.year < 0:
self.year = 0
print("输入年份出错,年份请大于0年")
if self.month < 1:
self.month = 1
elif self.month > 12:
self.month = 12
print("输入月份出错,月份请大于或等于1月,小于或等于12月")
if self.day < 1:
self.day = 1
elif self.day > 30:
self.day = 30
print("输入日期出错,日期请大于或等于1号,小于或等于30号")
def __str__(self):
return "{}年{}月{}日".format(self.year, self.month, self.day)
def difference(self, other):
d1 = self.year * 360 + self.month * 30 + self.day
d2 = other.year * 360 + other.month * 30 + other.day
result = d1 - d2
if result < 0:
result = -1 * result
return "两个日期差%d天" % result
def plus(self, n):
day, month, year= self.day, self.month, self.year
day = day + n
while day > 30:
month = month + 1
day -= 30
while month > 12:
year = year + 1
month -= 12
return "{}年{}月{}日".format(year, month, day)
def num_date(self, year, n):
year = self.year
month = 1
if n > 360 or n < 0 :
print("找不到这天,输入的天数有误")
else:
while n > 30:
month += 1
n -= 30
if month > 12:
return "范围出错,找不到这天"
day = n
return "{}的{}天是{}月{}日".format(year, n, month, day)
def adjust(self, n):
self.day += n
if self.day > 0:
while self.day > 30:
self.day -= 30
self.month += 1
while self.month > 12:
self.month -= 12
self.year += 1
else:
while self.day < 0:
self.day += 30
self.month -= 1
while self.month < 1:
self.year -= 1
self.month += 12
if self.year < 0:
return "调整日期出错,超出范围"
return "{}年{}月{}日".format(self.year, self.month, self.day)
3. 请扩充本章给出的有理数类,加入一些功能:
a)其他运算符的定义;
b)各种比较和判断运算符的定义;
c)转换到整数(取整)和浮点数的方法;
d)给初始化函数加入从浮点数构造有理数的功能;
def __sub__(self, another):
den = self._den * another.den()
num = (self._num * self.den() - self._den * another.num())
return Rational(num, den)
def __ne__(self, another):
return self._num * another.den() != self._den * another.num()
def change(self):
return self._den//self._num #转换到int
return self._den/self._num #转换到float
def change_r(self):
return float.as_integer_ratio(self._den / self._num)
4. 本章2.2.2节中有理数类的实现有一个缺点:每次调__init__都会对两个参数做一遍彻底检查。但是,在有理数运算函数中构造结果时,其中一些检查并不必要,浪费了时间。请查阅Python手册中与类相关的机制,特别是名字为__new__的特殊方法等,修改有关设计,是得到的实现能完成工作但又能避免不必要的检查。
class Rational(object):
def __new__(cls, num, den=1):
if not isinstance(num, int) or not isinstance(den, int):
raise TypeError
return object.__new__(cls)
def __init__(self, num, den=1):
if den == 0:
raise ZeroDivisionError
"........"
5. 请基于2.5节的工作继续扩充,为该学校人事系统定义研究生类、教师类和职员类。
略略略
以上记录的是自己学习的过程,课后练习也全是凭借个人理解来完成的,正确答案以及方式有待商榷,如果有大神偶然看见小弟的这篇笔记,有不对的地方也恳请斧正,谢谢。