一、概念
1.1 类属性、实例属性、私有属性等
1.类:拥有相同属性和功能的对象的集合
2.对象:是类的实体
3.封装:隐藏了对象的属性和实现细节,只是对外提供接口或入口
4.类的创建:
class 类名称:
class 类名称()
5.类属性:
定义在类里面,在方法(函数外面)的属性
访问:类名称.类属性名称
可以直接访问,不需要实例化
6.实例属性
定义在__init__(初始化方法)中
访问:
在类里面:self.xxx (如果不加self,就只能在init里面用)
类外面:类实例.名称
>> __init__在类实例化的时候会自动调用
>>self:是实例本身,是个占位符,习惯写法
7.私有属性
不能被外部访问的属性是私有属性且不能被继承
创建:双下划线开头
__test=‘test’
8.私有方法
不能被子类继承的方法
def __test01(self):
二、类的特性
2.1 继承:
子类继承父类之后,就会拥有父类的属性和方法(私有fan属性和私有方法不可以继承)
语法: class test02(test01):
调用父类的方法:
(子类里面)self.方法名()
(子类外面)类实例.方法名()
如果子类和父类有相同的属性或方法,优先使用子类自己的
super().方法名
用来调用父类的方法
不管子类有没有实现该方法,只在父类里面找
如果不写继承的类,默认继承python的基类object()
2.2 举例
class Test01:
def __init__(self):
print('父类 >>> __init__')
def test01(self):
print('父类 >>> test01')
def __test02(self):
self.test01()
print('父类 >>> test01')
class Test02(Test01):
def __init__(self):
print('子类 >>> __init__')
def test01(self):
print('子类 >>> test01')
def test03(self):
self.test01() # 调用test01方法,先找自己类是否有该方法,有就执行,没有再去父类去找该方法
print('子类 >>> test03')
super().__init__() # 父类的初始化方法
super().test01() # 父类的方法
if __name__ == '__main__':
a=Test02()
a.test03()
2.3 多继承
多继承:一个类继承了多个类,这个类会继承父类们所有方法和属性(私有的除外)
class Test01:
def test01(self):
print('Test01 >>> test01')
class Test02:
def __test01(self):
print('Test02 >>> test02')
class Test03(Test01,Test02):
print(Test03().test01) #会打印Test01 >>> test01,从左往右开始调用方法
四、实例方法、类方法、静态方法
实例方法:
定义在类中,第一个参数【实例对象】,习惯用self(类实例)来表示
调用:类实例.方法名()
类方法:
定义在类中,通过@classmethod修饰,第一个参数是cls(类本身)
可以使用类的属性,不能调用实例方法或者实例属性
调用:类名称.方法名()或者 类实例.方法名()
使用场景:不需要重复初始化的时候,用在工具上比较多
静态方法:
定义在类中,通过@staticmethod,没有self或cls(实例或类),参数随意
调用:类名称.方法名()或者 类实例.方法名()
类方法和静态方法的区别:
相同点:
都是挂在类下面,可以通过类访问,都可以被类实例调用
不同点:
类方法可以使用类的属性和静态方法
静态方法不可以使用类的属性和方法
def test01(self): #类实例方法
print('test01')
@classmethod #类方法
def test02(cls):
print('test02')
@staticmethod #静态方法
def test03():
print('test03')
if __name__=='__main__':
Test01().test01() #调用实例方法
Test01.test02() #调用类方法
Test01.test03() #调用静态方法