思维导图
四、实例方法、类方法和静态方法!
实例方法 : 第一个参数必须是实例对象,该参数一般约定为"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)
简单的单例设计模式的特点可以在下面一张图上很好的反应出来: