1、类方法、实例方法、静态方法
实例方法
定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
调用:只能由实例对象调用。
类方法
定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
调用:实例对象和类对象都可以调用。
静态方法
定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
调用:实例对象和类对象都可以调用。
使用装饰器@staticmethod。
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。
源文档 <https://www.cnblogs.com/wcwnina/p/8644892.html>
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
2、@staticmethod和@classmethod的作用与区别
源文档 <https://blog.csdn.net/m0_37636884/article/details/81035697>
既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
从它们的使用上来看,
- @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
- @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
源文档 <https://blog.csdn.net/m0_37636884/article/details/81035697>
3、装饰器 python 使用property
装饰器(Decorator)可以在不改变函数的前提下给函数增加功能,Python中内置的装饰器@property就是把一个方法变成属性调用的。
4、
所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉
这里记住的是类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。(这就是这个问题的重点)
类变量和实例变量
类变量就是供类使用的变量,实例变量就是供实例使用的.
1、装饰器
代码有一个开放封闭的原则,简单来说就是,已经实现的功能代码不允许被修改,单可以被扩展
装饰器(Decorator)可以在不改变函数的前提下给函数增加功能,Python中内置的装饰器@property就是把一个方法变成属性调用的。
2、深浅拷贝
Python中对象的赋值都是进行对象引用(内存地址)传递
使用copy.copy(),可以进行对象的浅拷贝,它复制了对象,但对于对象中的元素,依然使用原始的引用.
如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝
对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有被拷贝一说
如果元组变量只包含空列表类型对象,则不能深拷贝
浅拷贝是指针拷贝
深拷贝是内容拷贝
copy deepcopy
3、局部变量和全局变量
作用域的问题
局部变量:就是在函数内部定义的变量
作用:为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
全局变量:
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是
如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
4、单继承和多继承
重写:所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
多态:
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态
多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。
5、# 实例化一个单例
class Singleton(object):
__instance = None
def __new__(cls, age, name):
#如果类数字能够__instance没有或者没有赋值
#那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
#能够知道之前已经创建过对象了,这样就保证了只有1个对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
a = Singleton(18, "dongGe")