# @classmethod
cls等同于大类名称Clock,所以cls(参数)等价于Clock(参数)
@classmethod
def now(cls):
ctime = localtime(time())
return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)
time类中的方法localtime是将秒数转化为年月日的固定格式,由固定的变量名储存,所以cls代指大类,然后把新的tm_hour,tm_min,tm_sec赋给大类自身的属性
##返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
from time import time
print "time.time(): %f " % time.time()
# ime.time(): 1234892919.655932
print(localtime(time()))
# time.struct_time(tm_year=2021, tm_mon=12, tm_mday=1, tm_hour=22, tm_min=7, tm_sec=55, tm_wday=2, tm_yday=335, tm_isdst=0)
可以直接对类方法进行创建对象,使得now方法本来就是一个对象,在进行调用时不需要实例化
然后该对象的属性仍是大类中的属性名,还能继续调用大类中的其他方法
def main():
# 通过类方法创建对象并获取系统时间
clock = Clock.now()
while True:
print(clock.show())
sleep(1)
clock.run()
super().__init__(name, age)相当于继承了Person中的init方法,然后填入init方法所需要的参数name,age
class Student(Person):
"""学生"""
def __init__(self, name, age, grade):
super().__init__(name, age)
self._grade = grade
含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写。(所以没有重写__init__方法)
以下面这个例子为例,Pet不需要实例化,只需要作为父类在不同宠物类进行继承即可;又因为要实现不同宠物要打印出不同的叫声,因此Pet中的make_voice方法需要@abstractmethod进行修饰,从而实现不同的子类对象会表现出不同的行为,此称为多态。
将Pet类处理成了一个抽象类,所谓抽象类就是不能够创建对象的类,这种类的存在就是专门为了让其他类去继承它。需要abc模块的ABCMeta元类和abstractmethod包装器来达到抽象类的效果。因此metaclass=ABCMeta是python中抽象类所必备的参数
pass只作为一个占位语句,保持结构完整
class Pet(object, metaclass=ABCMeta):
"""宠物"""
def __init__(self, nickname):
self._nickname = nickname
@abstractmethod
def make_voice(self):
"""发出声音"""
pass
可以把要执行的对象写为列表,然后用循环依次进行
def main():
pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
for pet in pets:
pet.make_voice()
想要自动输出属性就要定义以下方法,不然打印对象print(Ultraman)出来的不是属性而是一串指针值
def __str__(self):
return '~~~%s奥特曼~~~\n' % self._name + \
'生命值: %d\n' % self._hp + \
'魔法值: %d\n' % self._mp
类内的方法必须要有self参数,因为他属于类。在类之外的就可以不需要self参数
一旦有一个True即跳出for循环,return可以立马终止最外层的循环
def is_any_alive(monsters):
"""判断有没有小怪兽是活着的"""
for monster in monsters:
if monster.alive > 0:
return True
return False
__repr__() 方法是类的实例化对象用来做“自我介绍”的方法,默认情况下,它会返回当前对象的“类名+object at+内存地址”,而如果对该方法进行重写,可以为其制作自定义的自我描述信息。
def __str__(self):
if self._face == 1:
face_str = 'A'
elif self._face == 11:
face_str = 'J'
elif self._face == 12:
face_str = 'Q'
elif self._face == 13:
face_str = 'K'
else:
face_str = str(self._face)
return '%s%s' % (self._suite, face_str)
def __repr__(self):
return self.__str__()
再一次,将对象存在了列表里,current属性由于默认为0,不需要输入,所以在方法括号里无需添加这个变量
class Poker(object):
"""一副牌"""
def __init__(self):
self._cards = [Card(suite, face)
for suite in '♠♥♣♦'
for face in range(1, 14)]
self._current = 0
isinstance(object, classinfo)是判断两个类型是否相同
def main():
emps = [
Manager('刘备'), Programmer('诸葛亮'),
Manager('曹操'), Salesman('荀彧'),
Salesman('吕布'), Programmer('张辽'),
Programmer('赵云')
]
for emp in emps:
if isinstance(emp, Programmer):
emp.working_hour = int(input('请输入%s本月工作时间: ' % emp.name))
elif isinstance(emp, Salesman):
emp.sales = float(input('请输入%s本月销售额: ' % emp.name))
# 同样是接收get_salary这个消息但是不同的员工表现出了不同的行为(多态)
print('%s本月工资为: ¥%s元' %
(emp.name, emp.get_salary()))