自学内容网 自学内容网

十一、面向对象进阶

学习目标

  • 说出类方法和实例方法的区别和使用场景
  • 能够实现单例设计模式
  • 继承的基本使用以及注意事项
  • 对象相关内置函数的使用
  • 能够说出什么是多态

一、类方法和静态方法

https://zhuanlan.zhihu.com/p/93178202 ---- 基础入门必看篇:Python静态方法个类方法实例分析

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def eat(self, food):
        print(self.name + "在吃"+food)
    
    # 如果一个方法里没有用到是对象的任何属性,可以将这个方法定义成static
    @staticmethod
    def demo():
        print('hello')

    @classmethod
    def test(cls): # 如果这个函数只用到了类属性,我们可以定义一个类方法
        # 类方法会有一个参数cls,也不需要手动的传参,会自动传参
        # cls指的是类对象 (Person)
        print('yes')

p = Person('张三', 18)

# eat() 是对象方法,可以直接使用 实例对象.方法(参数) 调用,不需要传递self。会自动将对象传递给self
p.eat('红烧牛肉面') # 直接使用实例对象调用方法

# 对象方法还可以使用类对象来调用 类名.方法名()
# 这种方式,不会自动给 self 传参,需要手动的指定 self
Person.eat(p1,'红烧牛肉面')

# 静态方法调用:没有用到实例对象的任何属性
# 1. 类调用
Person.demo()
# 2. 实例调用
p1.demo()

# 类方法:可以使用实例对象和类对象调用,均不需要传cls,会自动将对象所属的类对象传递给cls
p1.demo()
Person.demo()

  • 静态方法、类方法、实例方法(对于所有的方法而言,在内存空间中均属于类,所以 在内存中也只保存一份。方法调用者不同、调用方法时自动传入的参数不同)
    在这里插入图片描述

在这里插入图片描述

二、单例模式

class Singleton(object):
    __instance = None # 保证全局唯一
    __is_first = True # 设置仅能初始化参数一次

    @staticmethod
    def __new__(cls, *args, **kwargs):
        # 申请内存,创建一个对象,并把对象的类型设置为cls
        if cls.__instance is None
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, a, b):
        if self.__is_first:
            self.a = a
            self.b = b
            self.__is_first = False # 动态设置实例属性

# 调用 __new__ 方法申请内存
# 如果不重写 __new__ 方法,会调用 object 的 __new__ 方法
# object 的 __new__ 方法会申请内存

原文地址:https://blog.csdn.net/weixin_44063529/article/details/140398787

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!