day13_下 Class中三大护法 及常用属性 单例模式(扩展)

思维导图

在这里插入图片描述

四、实例方法、类方法和静态方法!

实例方法 : 第一个参数必须是实例对象,该参数一般约定为"self",通过他来传递实例的属性和方法(也可以传递类的属性和方法).
调用 : 只能由实例对象来调用

类方法:使用@classmethod装饰器修饰的方法,被称为类方法,第一个参数必须是当前类对象 ,该参数一般约定为"cls",通过他来传递类的属性和方法(不能传实例对象的属性和方法)
调用 : 可以通过类名调用,也可以通过对象调用,但是一般情况下使用类名调用

静态方法:使用@staticmethod装饰器修饰的方法,被称为静态方法,可以通过类名调用,也可以通过对象调用,但是一般情况下使用类名调用

代码演示:

class Test(object):
#1.类属性
age = 100

def __init__(self,name):
  #2.实例属性
  self.name = name

#3.成员方法,通过对象调用
#必须有一个参数,这个参数一般情况下为self,self代表是当前对象
def func(self):
  print("func")

#4.类方法
"""
a.必须有一个参数,这个参数一般情况下为cls,cls代表的是当前类
b.类方法是属于整个类的,并不是属于某个具体的对象,在类方法中禁止出现self
c.在类方法的内部,可以直接通过cls调用当前类中的属性和方法
d.在类方法的内部,可以通过cls创建对象
"""
@classmethod
def test(cls):
  print("类方法")
  print(cls)   #<class 'methodDemo01.Test'>
  print(cls.age)

  #6
  #注意:cls完全当做当前类使用
  c = cls("hello")
  c.func()

#7.静态方法
@staticmethod
def show():
  print("静态方法")

t = Test("hjfsh")
t.func()

#5,.调用类方法
Test.test()   #类名.类方法的名称()
t.test()       #对象.类方法的名称()

#7。调用静态方法
Test.show()
t.show()

总结:实例方法【成员方法】、类方法以及静态方法之间的区别

a.语法上

​ 实例方法:第一个参数一般为self,在调用的时候不需要传参,代表的是当前对象【实例】

​ 静态方法:没有特殊要求

​ 类方法:第一个参数必须为cls,代表的是当前类

b.在调用上

​ 实例方法:只能对象

​ 静态方法:对象 或者 类

​ 类方法:对象 或者 类

c.在继承上【相同点】

​ 实例方法、静态方法、类方法:当子类中出现和父类中重名的函数的时候,子类对象调用的是子类中的方法【重写】

代码演示:

class SuperClass(object):
@staticmethod
def show():
  print("父类中的静态方法")

@classmethod
def check(cls):
  print("父类中的类方法")

class SubClass(SuperClass):
pass

s = SubClass()
s.show()
s.check()

注意:注意区分三种函数的书写形式,在使用,没有绝对的区分

以上三种方法的特点和区别可以在下面一张图上很好的反应出来:
在这里插入图片描述

五、类中的常用属性

__name__
	通过类名访问,获取类名字符串
	不能通过对象访问,否则报错
	
__dict__
	通过类名访问,获取指定类的信息【类方法,静态方法,成员方法】,返回的是一个字典
	通过对象访问,获取的该对象的信息【所有的属性和值】,,返回的是一个字典
	
__bases__
	通过类名访问,查看指定类的所有的父类【基类】

代码演示:

class Animal(object):
def __init__(self,arg):
  super(Animal, self).__init__()
  self.arg = arg


class Tiger(Animal):
age = 100
height = 200

def __init__(self,name):
  #super(Tiger, self).__init__(name)
  self.name = name

def haha(self):
  print("haha")

@classmethod
def test(cls):
  print("cls")

@staticmethod
def show():
  print("show")


if __name__ == "__main__":

#1.__name__
print(Tiger.__name__)  #Tiger

t = Tiger("")
#print(t.__name__)  #AttributeError: 'Tiger' object has no attribute '__name__'

#2.__dict__
print(Tiger.__dict__)  #类属性,所有的方法
print(t.__dict__)   #实例属性

#3.__bases__,获取指定类的所有的父类,返回的是一个元组
print(Tiger.__bases__)

六、单例设计模式【扩展】

1.概念

什么是设计模式

​ 经过已经总结好的解决问题的方案

​ 23种设计模式,比较常用的是单例设计模式,工厂设计模式,代理模式,装饰模式

什么是单例设计模式

​ 单个实例【对象】

​ 在程序运行的过程中,确保某一个类只能有一个实例【对象】,不管在哪个模块中获取对象,获取到的都是同一个对象

​ 单例设计模式的核心:一个类有且仅有一个实例,并且这个实例需要应用在整个工程中

2.应用场景

实际应用:数据库连接池操作-----》应用程序中多处需要连接到数据库------》只需要创建一个连接池即可,避免资源的浪费

3.实现
3.1模块

Python的模块就是天然的单例设计模式

模块的工作原理:

​ import xxx,模块被第一次导入的时候,会生成一个.pyc文件,当第二次导入的时候,会直接加载.pyc文件,将不会再去执行模块源代码

3.2使用new
__new__():实例从无到有的过程【对象的创建过程】

代码演示:

class Singleton(object):
#类属性
instance = None

#类方法
@classmethod
def __new__(cls, *args, **kwargs):
  #如果instance的值不为None,说明已经被实例化了,则直接返回;如果为NOne,则需要被实例化
  if not cls.instance:
      cls.instance = super().__new__(cls)

  return cls.instance

class MyClass(Singleton):
pass

#当创建对象的时候自动被调用
one = MyClass()
two = MyClass()

print(id(one))
print(id(two))

print(one is two)

简单的单例设计模式的特点可以在下面一张图上很好的反应出来:
在这里插入图片描述

每天进步一点点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值