文章目录
学习目标
- 说出类方法和实例方法的区别和使用场景
- 能够实现单例设计模式
- 继承的基本使用以及注意事项
- 对象相关内置函数的使用
- 能够说出什么是多态
一、类方法和静态方法
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__ 方法会申请内存