面向对象类
定义类
在python中,将具有相同属性和方法的对象归为一个类,在使用类之前,首先得创建类
类创建的语法:
class 类名:
语句
类的用法
类只有在实例化才能使用,类的调用和函数的调用差不多,用类名()就可以实例化类
类对象
类实例化就生成了一个对象,它支持两种操作
- 属性的引用
- 实例化
类方法
定义类的方法和定义函数差不多,区别如下:
- 方法的第一个参数必须是self,而且不能省略
- 方法的调用必须先实例化该类,用实例名.方法名(参数)来调用
构造方法
构造函数就是类实例化初始化数据,init()方法就是构造方法
class person:
"""人类"""
def __init__(self,name,age):
"""初始化名字和年龄"""
self.name=name
self.age=age
def talking(self):
print(self.name.title()+"叫了你一声")
def playball(self):
print(str(self.age)+"的"+self.name+"正在打球")
类可以创建多个实例,通过实例名=类()
来创建的,类就是一个抽象的具有相同属性,功能的模板,可以创建很多实例
私有方法
python中私有属性,方法,完全取决于它的名字,名字以__开始
的就是私有属性或者方法,当类的内部调用用 .
来调用私有属性
私有函数,属性,方法有以下特点:
- 私有函数不可以被它的
模块外部调用
- 私有方法不能从
类的外部
调用 - 私有属性不能从
类的外部被访问
析构方法
python中析构方法是__del__(),当调用del()内置对象删除是会调用它本身的析构函数__del__(),当某个对象调用完毕后,也会调用一次析构函数来释放资源,例如:下面是我对堆和栈的理解,再加上类的析构函数,希望多多指教
小朋友手上只能抓住三个气球,他拿着三个气球。气球本身就是一个对象,而手上的线就是对象的引用,当小朋友放开手中的线,那么对象就没有得到引用,气球就飞掉了,就是小朋友手中少抓了一个气球,小朋友可以轻松一点,也就是我们说的释放资源,自己调用了__del__()对象
静态方法和类方法
- 实例方法:隐含调用的参数是类的实例
- 类方法:隐含调用的参数是类,定义类方法使用
装饰器@classmethod
必须有默认参数cls - 静态方法:没有隐含调用参数,定义静态方法使用
修饰符@staticmethod
进行修饰,没有默认参数
在调用类方法和静态方法时,可以使用类名进行调用
,在调用前无须实例化,也可以通过实例来进行调用
类的专有方法
- new():是在实例创建之前被调用的,用于创建实例
- init():构造函数,在生成实例之后调用
- del():析构函数,在释放资源时调用
- repr():打印,转换
- setitem():按照索引赋值
- getitem():按照索引获取值
- len():获得长度
- cmp():比较运算
- call():函数调用
- add():加运算
- sub():减运算
- mul():乘运算
- div():除运算
- mod():求余运算
- pow():乘法
类属性
在类中将属性分为实例属性和类属性
- 实例属性:同一个类的不同实例,值没有关联,使用self.属性定义和调用
- 类属性:
同一个类所有实例共用的
,在类中独立定义,使用类名.类变量名引用,只要一个实例发生改变其他实例也会发生改变
修改属性值
python中有两种方法来修改属性值:
-
直接通过实例来修改
实例.属性=值
-
通过自定义方法修改
通过自定义更新值,自定义增加值来修改值
私有属性
私有属性通过__属性名定义的,只能类内部访问,类外部访问会提示找不到相关属性或者方法
严格意义上来说在类的外面也可以调用私有属性,只是难以处理,python中没有真正的私有
继承
类的继承是新建的类获取已有的类的属性,方法,变量等,继承的类可以称为派生类或者子类,被继承的类称为基类或者父类
定义子类
class 子类(父类):
语句
多继承
子类可以获取父类的特性,子类可以继承多个父类用,
隔开,比如父类的方法名一样,那么按顺序继承
子类调用父类的方法可以用super()函数
多继承
class 子类(父类,父类):
语句
子类方法:
super().方法
子类也可以定义自己的属性和方法,子类也可以被继承,父类的私有属性和方法不能被继承,但是可以被子类重写
class a:
def __init()__(self,name):
self.__name=”小包“
self.age=18
class b(a):
def sayname(self):
print (self.__name)
X=b()
X.sayname()
方法重写
就是方法名和父类的方法名一样,就可以把父类的方法改成子类的方法