面向对象思想有三个基本特征:封装、继承和多态
一、创建和使用类
实例:
# 类的定义
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name + " is now sitting.")
def roll_over(self):
print(self.name + " rolled over!")
# 类使用
dog = Dog("xiao","1")
dog.sit()
知识点:
1. 初始化方法 _init _()
形参 self 必不可少,还必须位于其他形参的前面,每个与类相关联的方法调用都自动传递实参 self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。self 会自动传递,因此我们不需要传递它。
2. 析构方法是__del__()
3. 定义枚举类
class 枚举类名(enum.Enum):
枚举常量列表
二、类成员的介绍
1. 类变量
属于类本身的变量,即类变量。类变量属于整个类,不是特定实例的一部分,而是所有实例之间共享一个副本,类变量要在方法之外定义。
class Dog():
count=0 # 类变量
def __init__(self, name, age):
self.name = name #实例变量
self.age = age #实例变量
# 类使用
dog = Dog("xiao","1")
Dog.count += 1 # 类变量的访问与操作
dog.name # 实例变量的访问
# 注意:如果通过实例变量对类变量赋值操作,这样会为实例创建一个同名的变量,从而覆盖类变量
# 通过实例访问 类变量或者类方法时,其原理都是先访问实例中是否存在该值,如果不存在才会访问类变量和类方法
dog.count =1
当通过实例读取变量时,Python 解释器会先在实例中找这个变量,如果没有找到再到类中去找;当通过实例为变量赋值时,无论类中是否有该同名类变量,Python 解释器都会创建一个同名实例变量。
2. 类方法
通过@classmethod
来声明类方法。
“类方法”与“类变量”类似,属于类不属于个体实例的方法,类方法不需要与实例绑定,但需要与类绑定,定义时它的第一个参数不是self ,而是类的type 实例
。
# 类方法
class Dog():
count=0 # 类变量
@classmethod
def getName(cls, name): #类方法
return name+"是第"+str(cls.count)+"只狗"
3. 静态方法
class Dog():
count=0 # 类变量
@staticmethod
def getName(name): #静态方法
return name+"是第"+str(Dog.count)+"只狗"
4. 访问权限
_xxx
:受保护成员;
__xxx
:私有成员;
__xxx__
:系统定义的特殊成;
注意:Python 没有严格的私有成员,所谓的私有python只是将__ 变量
修改为_ 类名__ 变量
,所以还是可以通过“ 对象._ 类名__ 变量”进行访问。
5. 定义属性
@ property
用来修饰getter 访问器,@ 属性名.setter
用来修饰setter 访问器。
这个定义属性和C#里面差不多。
class Dog():
def __init__(self, name, year=1):
self.name= nam
self.__year = year
# 定义属性
@property
def year(self):
return self.__year
@weight.setter
def year(self, year):
self.__year = year
# 访问属性
dog=Dog("xiao",1)
dog.year # 注意访问的方式,不是以前那种通过get set 方法来访问属性了
三、类的继承
大多数的编程语言是不支持多继承的,因为多继承会发生类成员名出现冲突。
Python 是支持多继承的 ,
Python 解决名称冲突的方法是:
这个 方案是,当子类实例调用一个方法时,先在子类中查找,如果没有找到则查找父类。 父类的查找顺序是按照子类声明的父类列表从左到右 查找
,如果没有找到再找父类的父类,依次查找下去。
class ElectricCar(Car):
def __init__(self, year):
super().__init__(make, model, year)# 继承时需要对父类进行初始化
1. 对父类进行初始化最好使用:super().__init__方式。
2.多继承时,使用super() 方法,由于python 中super() 算法的原因,必须把全部的参数传递给父类,否则会报错 。
3.单继承时,使用super 方法() ,参数不能全部传递,只能传父类方法所需的参数,否则会报错。
类型检查函数:
isinstance(object,classsinfo) 函数
,它可以检查object 实例是否由classinfo 类或classinfo 子类所创建的实例。
issubclass (class, classsinfo) 函数
,它用来检查class 是否是classinfo 的子类。
四、类的魔法方法
所谓的魔法方法就是带双下划线开头的方法。
__str__()
:返回该对象的字符串表示;__eq__()
:指示其他某个对象是否与此对象“相等”,"=="时调用;__init__()
:初始化方法;__del__()
:析构方法;__new__()
:构造方法;__getattribute__(self,name)
:定义当该类的属性被访问时的行为;__setattr__(self,name,value)
:定义当一个属性被设置时的行为;__delattr__(self,name)
:定义当一个属性被删除时的行为;__hasattr__(object,name)
:检查对象是否有此属性;__getattr__(object,name[,default])
:获得属性值,如果不存在则返回默认值default ;property(fget,fset,fdel)
:设置一个属性,三个参数为函数;
五、模块的导入
import car
import time as t
from module_name import *
from module_name import Car
from module_name import Car as C
当模块作为主程序运行时,__name__==__main__
今天睡了一下午,还是舒服的!!!