python、类
目录
类
1. 类、实例
2. 类变量和实例变量
3. 类方法和实例方法
区分
4. 魔术方法(magic methods)
5. 自定义容器(custom containers)
6. 私有变量:在变量名前加两个下划线__
7. 装饰器property (属性)
8. 继承inheritance
1)方法重写
2)多重继承(multiple inheritance):一个类同时继承多个父类
3)抽象类(作为接口)
9. 多态(Polymorphism)
以前端举例:
10. Extending Built-in Types
11. data class(没有任何方法,只有数据的类)
类
1. 类、实例
命名:驼峰命名法,首字母大写,不使用_连接。例如MyPoint
class: blueprint for creating new objects,like human
object: instance of a class, like john,mary
2. 类变量和实例变量
attribute(实例变量): variable defined inside a class
类变量:被所有实例共享
实例中改变类变量的值,不会影响到其他实例变量
3. 类方法和实例方法
定义类方法需要装饰器decorator,类方法可以作为出厂设置来定义特定的实例对象。
cls为class的缩写
区分
-
用类方法:需要操作类属性,或在继承中动态处理子类。
-
用静态方法:代码逻辑属于类但不需要访问类或实例状态。
-
用实例方法:需要操作实例属性(默认情况)
4. 魔术方法(magic methods)
即开头和结尾有下划线的方法,由python解释器自动调用。
python 3 magic methods
Python3中的魔术方法汇总_python magic-CSDN博客
例如__ str__(): 将对象转换为字符串时,调用此函数。
没有__ str__()方法时,输出print(point),返回的时类的名称与地址
有__ str__()方法后,输出类:
__ eq__():定义==
没有该函数时,==对比的是两个对象的地址
有该函数:
__ gt__(): 定义>;重载该函数后,python自动定义lt()即<
__ add__(): 定义+
5. 自定义容器(custom containers)
6. 私有变量:在变量名前加两个下划线__
私有变量只能在类的内部访问,外部或子类无法直接访问。
但私有变量并非绝对安全,当将tags设置为私有变量后,python自动将其重命名,因此根据名称改写规则,通过新变量名仍然可以访问该变量。
7. 装饰器property (属性)
判断设定的变量值是否合理。
常规实现方法:
若要判断设定的变量值是否正确,可将该属性设置为私有变量,建立两个方法来设置和获取变量值。设置时进行判断,判断成功后设置私有变量的值,获取时在类内部返回私有变量的值。
使用product.price.set_price和product.price.get_price来设置和获取变量
python精简实现方法:
property:Python 提供的一种装饰器,用于将类的方法转换为属性访问的形式。它可以让我们在访问属性时,隐式调用方法,从而实现对属性的控制和预处理。(可以想象为有线耳机与蓝牙耳机,装饰器将调用方法隐藏了,如同蓝牙耳机将线隐藏了)
使用product.price = ?和product.price来设置和获取变量
但这并不能隐藏set_price和get_price两个方法。我们可以选择在这两个方面面前放上@classmethod,将其作为类方法,以此来隐藏掉。
但更简单的方法是直接在方法前放上装饰器property,如下所示:
只需这样,就可以在设置变量时同时判断其是否合理,且调用方式与普通变量相同。
8. 继承inheritance
继承或组合:防止代码中的重复冗余
使用情况:仅一两个级别时适用。使用中应避免多级继承(multi-level inheritance)的问题。
在父类中定义公共行为或公共方法。所有类都继承了object类。
判断是否为类的实例和类的子类
1)方法重写
重写父类的方法,若重写init方法,则父类的init不再执行。
要想执行父类的init方法,则应执行super().__ init__()
2)多重继承(multiple inheritance):一个类同时继承多个父类
适用情况:
继承的父类之间没有任何共同之处。
例如:Flyer,Swimmer -> FlyingFish
3)抽象类(作为接口)
两个类有相似之处时,可以将一个抽象类作为它们的父类,该父类类似为一个半成品。
抽象类中的方法可用abstractmethod来装饰,抽象类不可以被实例化。
继承抽象类后,需重写被abstractmethod装饰的方法。
9. 多态(Polymorphism)
多态意味着很多形式,即many forms
以前端举例:
文本框和下拉列表都继承于ui控件,同名的draw却有不同的功能,这就是多态。
注:python的一种动态类型的语言,他不检查对象的类型。如上文中的draw方法,传递进来的control只要有draw方法,python就很乐意接受。
10. Extending Built-in Types
对内置类型使用继承
11. data class(没有任何方法,只有数据的类)
namedtuple:创建一个自定义的元组对象。这个对象不仅具有元组的不可变性,还可以通过属性名而不是索引来访问,使得代码更加清晰。