面向对象编程(2)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/meiqixiao/article/details/90371995

实例方法

  • 实例方法指的是只有实例对象才可以调用的方法
  • 在类对象中定义实例方法时,第一个形参表示调用该方法的实例对象,其对应的实参由系统自动传入。第一个形参的名称通常是self,也可以是其它名称。
  • 实例方法只能被实例对象所调用,有两种调用方式:
    - 在类对象的内部:self.方法名([实参])
    - 在类对象的外部:实例对象.方法名([实参])类对象的所有实例对象都有一个指向类对象的指针,所以,类对象的所有实例对象都可以调用类对象中定义的实例方法
  • 调用实例方法时,系统将自动调用该方法的实例对象作为实参传递给第一个形参。第一个实参会传递给第二个形参,第二个实参会传递给第三个形参,依次类推。
class MyClass(object):
        # 在类对象中定义实例方法
        def im1(self, p1, p2):
              print(p1, p2)
        def im2(self):
        # 在类对象内部(其它实例方法中)调用实例方法
               self.im1(1, 2) 
mc = MyClass()
 # 在类对象的外部调用实例方法
 mc.im1(1, 2)   #  1  2
 mc.im2()         #  1  2

函数装饰器

  • 对于某个函数,若希望在不改变函数代码的前提下,为该函数增加额外的功能,那么就可以使用装饰器来装饰该函数。
  • 装饰器是一个函数,装饰器接受一个函数作为参考(传入的实参是被装饰的函数)。
  • 装饰器的内部嵌套定义另一个函数,内函数中会引用装饰器的参数,且装饰器的返回值是内函数。
  • 为了让内函数接受任意类型的参数,将内函数的形参定义为(*args, **kwargs)
  • 在函数中首先完成为被装饰函数添加的新功能,然后调用被装饰的函数。
  • 把装饰器应用到被装饰函数的语法为:在被装饰函数的前面添加“@装饰的函数名”
-------原函数------------
def add(a, b)
      pass
def subt(a, b):
      pass
------------加了装饰函数-----------------
# 装饰
def notice():
      print("公告")
      print("..........")
 
def add(a, b):
      notice()
      pass
      
def subt(a, b):
      notice()
      pass
---------等价于----------
def add(a, b):
      print("公告")
      print("..........")
      pass

def subt(a, b):
      print("公告")
      print("..........")
      pass
def notice(func):
      def wrapper(*args, **kwargs):
            print("公告")
            print(".........")
            return func(*args, **kwargs)
       return wrapper
--------------------------------------------------
# 装饰器应用到函数中
@notice
def add(a, b):
      return a+b

@notice
def subt(a, b):
      return a-b
--------结果--------------
>>>print(add(3, 5))
 公告
 .............
 8     

类方法

  • 类方法指的是类对象中使用装饰器@classmethod进行装饰的方法。
  • 在类对象定义类方法时,必须使用装饰器@classmethod进行装饰,此外,第一个形参表示类对象,其对应的实参由系统自动传入。第一个形参的名称通常是cls,也可以是其它名称。
  • 类方法可以被类对象所调用,语法格式为类对象.方法名([实参])cls.方法名([实参])
  • 类方法也可以被实例对象所调用,语法格式为实例对象.方法名([实参])self.方法名([实参])
  • 类对象的所有实例对象都有一个指向类对象的指针,所以,类对象的所有实例对象都可以调用类对象中定义的类方法。
  • 调用类方法时,系统将自动将类对象作为实参传递给第一个形参。第一个实参会传递给第二个形参,第二个实参会传递给第三个形参,依次类推。
class MyClass(object):
          # 在类对象中定义类方法
          @classmethod
          def class_func(cls, a, b):
                print(a, b)

          @classmethod
          def class_func_1(cls, a, b):
                print(a, b)  

           # 在类对象内部调用类方法
           @classmethod
           def class_func_2(cls):
                  MyClass.class_func_1(1, 2)
                  # or
                  cls.class_func_1(1, 2)

            # 通过实例对象调用类方法
            def ins_func(self):
                  self.class_func_1(1, 2)

----------------------------------------------------------
# 通过类对象调用类方法
>>>MyClass.class_func('Hi' , 'everyone!')
Hi everyone!

# 通过实例对象调用类方法
>>>mc = MyClass()
>>>mc.class_func(1, 2)
1  2

>>>mc = MyClass()
>>>mc.class_func_2()
1  2
1  2

mc.ins_func()
1  2

>>>MyClass.class_func_2()
1  2
1  2

>>>MyClass.ins_func()
TypeError

猜你喜欢

转载自blog.csdn.net/meiqixiao/article/details/90371995