Python-100-Days学习笔记day09

本文探讨了Python中类方法的使用,包括`classmethod`的作用、抽象类的实现、多态示例以及继承与初始化。重点讲解了如何通过类方法创建对象、抽象类的abstractmethod和实际应用,如宠物类的继承与行为差异化。
摘要由CSDN通过智能技术生成
#
@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=ABCMetapython中抽象类所必备的参数

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()))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值