面向对象进阶

今日内容:

  1、__slots__魔法

  2、静态方法和类方法

  3、继承

  4、嵌套函数

  5、装饰器

 

---------------------------------------------------------------------------------------------------------------------

1、__slots__魔法

         Python是一门动态语言(如下所示:),通常,动态语言允许我们在程序运行时给对象绑定新的属性或方法,当然也可以对已经绑定的属性和方法进行解绑定。如果限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。

 

2、静态方法和类方法

静态方法和类方法都是通过给类发消息来调用的

  1)静态方法:如果类中需要非该类成员存在,则可以使用静态调用的方法@staticmethod

案例一:

  #  三个函数求正方形的面积

---------------------------------------------------------------------------------------------------------------------------------

class Name(object):
  def __init__(self,a,b,c,d):  # 定义四条边
    self.a = a
    self.b = b
    self.c = c
    self.d = d
  @staticmethod
  def is_valid(a,b,c,d):
    for i in [b,c,d]:
      if i !=a:     # if判断四条边是否相等
        return False
    else:
      return True
  def area(self):
    if res == True:
      area_ = self.a * self.b   #求正方形面积
        return area_
def main():
  name = Name(2,2,2,2)
  res = name.is_valid(2,2,2,2)
  if res == True:
    print(name.area())
main()

---------------------------------------------------------------------------------------------------------------------------------

2)类方法:在类方法中的第一个参数约定名为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()

---------------------------------------------------------------------------------------------------------------------

3、继承

用子类对象去替换掉一个父类对象,示例如下:

案例三:

---------------------------------------------------------------------------------------------------------------------

class A(object):
  def __init__(self,a1):
    self.a = 1000
    self.a1 = a1
  def sum(self):
    sum_ = self.a+self.a1
    return sum_
class B(A):
  def __init__(self,a1,b1):
    self.b1 =b1
    A.__init__(self,a1)
  def Print(self):
    res =self.sum()
    print(res)
def main():
  b=B(100,'111')
  b.Print()
main()

 

---------------------------------------------------------------------------------------------------------------------

4、嵌套函数

python允许创建嵌套函数,也就是说可以在函数里面定义函数。示例如下:

例1:

例2:

5、装饰器

python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。示例如下:

例1:

--------------------------------------------------------------------------------------------------------------------

'''
定义了一个函数deco,函数无参
'''
def deco(func):
  print("HELLO1")
  def warp():
    return func()
  return warp

@deco
def Joker():
  print('hello')

Joker()

--------------------------------------------------------------------------------------------------------------------

例2:

--------------------------------------------------------------------------------------------------------------------

'''
定义了一个函数deco,函数有参
'''
def deco(func):
  def warp(H):
    print("Joker")
    return func(H)
  return warp

@deco
def Joker(name):
  print('hello %s'%name)

Joker('huwang')

------------------------------------------------------------------------------------------------------------------

 

posted @ 2019-08-08 19:59  honey0230  阅读(170)  评论(0编辑  收藏  举报