面向对象OOP
OOP:Object Oriented Programming,面向对象编程,面向对象中的对象(Obiect),通常是指客观世界中存在的对象,这个对象具有唯一性,对象之间各不相同,各有各的特点,每个对象都有自己的运动规律和内部状态;对象与对象之间又是可以相互联系、相互作用的。另外,对象也可以是一个抽象的事物。例如,可以从圆形、正方形、三角形等图形抽象出一个简单图形,简单图形就是一个对象,它有自己的属性和行为,图形中边的个数是它的属性,图形的面积也是它的属性,输出图形的面积就是它的行为。概括地讲,面向对象技术是一种从组织结构上模拟客观世界的方法。
对象Object由属性和行为组成,在 Python 中,一切都是对象。即不仅是具体的事物称为对象,字符串、函数等也都是对象
类class
类是封装对象的属性和行为的载体,反过来说,具有相同属性和行为的一类实体被称为类.将类实例化Instance之后就是对象
面向对象程序设计的特征
面向对象程序设计具有三大基本特征:封装、继承和多态
封装
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。
继承
继承是实现重复利用的重要手段,子类通过继承复用了父类的属性和行为的同时,又添加了子类特有的属性和行为。python没有接口interface的概念,继承是支持多个父类继承的.而C#是单继承的,C#通过实现接口来伪装多继承
多态
将父类对象应用于子类的特征就是多态.比如阿猫(Cat)阿狗(Dog)都是动物(Animal),都是Run()这个行为,但阿猫(Cat)和阿狗(Dog)运动行为是不一样的
定义类class
class ClassName:
'''类的帮助信息''' #类的描述
statement #类体
ClassName:用于指定类名,一般使用大写字母开头,如果类名中包括两个单词,第二个单词的首字母也大写,这种命名方法也称为“Pascal命名法”,这是惯例。当然,也可根据自己的习惯命名,但是一般推荐按照惯例来命名。
""类的帮助信息":用于指定类的文档字符串,定义该字符串后,在创建类的对象时,输入类名和左侧的括号“(”后,将显示该信息。
statement: 类体,主要由类变量(或类成员)、方法和属性等定义语句组成。如果在定义类时没想好类的具体功能,也可以在类体中直接使用 pass 语句代替。
创建类的实例
class 语句本身并不创建该类的任何实例。所以在类定义完成以后,可以创建类的实例,即实例化该类的对象。创建类的实例的语法如下:
ClassName(parameterList)
实例化类时,将自动调用__init__()方法,该方法可以认为是C#中的构造方法(函数)
__init__()方法
在创建类后,通常会创建一个 __init__()方法。该方法是一个特殊的方法,类似 Java 语言中的构造方法。每当创建一个类的新实例时,Python 都会自动执行它。 __init__()方法必须包含一个 self参数,并且必须是第一个参数。self参数是一个指向实例本身的引用,用于访问类中的属性和方法。在方法调用时会自动传递实际参数 self。因此,当 __init__()方法只有一个参数时,在创建类的实例时,就不需要指定实际参数了。self参数类似于C#的this,代表这个类本身的对象
创建类的成员来访问
创建实例方法并访问
所谓实例方法,是指在类中定义的函数。该函数是一种在类的实例上操作的函数。同__init__()方法一样,实例方法的第一个参数必须是 self,并且必须包含一个 self参数。
实例方法创建完成后,可以通过类的实例名称和点(.)操作符进行访问。
def functionName(self,parameterList):
block
functionName:用于指定方法名,一般使用小写字母开头;
self:必要参数,表示类的实例,其名称可以是 self 以外的单词,使用 self 只是一个习惯而己:
parammeterlist:用于指定除 self参数以外的参数,各参数间使用逗号“,”进行分隔;
block:方法体,实现的具体功能。
创建属性成员来访问
数据成员是指在类中定义的变量,即属性,根据定义位置,又可以分为类属性和实例属性。
类属性
类属性是指定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值,也就是
在所有实例化的对象中公用。类属性可以通过类名称或者实例名访问。
实例属性
实例属性是指定义在类的方法中的属性,只作用于当前实例中。
实例属性只能通过实例名访问。如果通过类名访问实例属性,将抛出异常
访问限制
在类的内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏了类内部的复杂逻辑。但是,Python 并没有对属性和方法的访问权限进行限制。为了保证类内部的某些属性或方法不被外部访问,可以在属性或方法名前面添加单下划线(_f)、双下划线( __foo)或首尾加双下划线( __f__ ),从而限制访问权限。其中,单下划线、双下划线、首尾双下划线的作用如下:
_f:以单下划线开头的表示 protected(保护)类型的成员,只允许类本身和子类进行访问,但不能使用“from module import*”语句导入。
__f:双下划线表示 private(私有)类型的成员,只允许定义该方法的类本身进行访问,而且也不能通过类的实例进行访问,但是可以通过“类的实例名.类名 xxx”方式访问。
__f__:首尾双下划线表示定义特殊方法,一般是系统定义名字,如__init__()
@property属性
创建用于计算的属性@property
在 Python 中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。
为属性添加安全保护机制
在 Python 中,默认情况下,创建的类属性或者实例是可以在类体外进行修改的,如果想要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能获取它的值。如果想要创建一个可以读取,但不能修改的属性,那么可以使用@property 实现只读属性。
通过属性不仅可以将属性设置为只读属性,而且可以为属性设置拦截器,即允许对属性进行修改,
但修改时需要遵守一定的约束。
示例程序:
class Snake:def __init__(self):print("实例化类时,自动调用构造函数__init__()")
snake = Snake()
class Mammal:'''哺乳动物'''heart='心形' #成员变量,需要类名.成员变量sequence=0def __init__(self,tooth,eye):Mammal.sequence=Mammal.sequence+1print("我是第",Mammal.sequence,"只哺乳动物,牙齿是:",tooth,",眼睛是:",eye,"心脏:",Mammal.heart)def run(self,state):'''哺乳动物奔跑方式,自定义函数:param state: 奔跑方式'''print("动物正在奔跑,奔跑方式为:",state)
dog=Mammal("犬齿","卵形")
dog.run("跨步")
for i in range(4):Mammal("臼齿","小眼")
class Rectangle:def __init__(self,width,height):self.width=widthself.height=height@property #将方法转换为属性def area(self):return self.width*self.height
rect=Rectangle(30,40)
print("矩形的宽度:",rect.width,",矩形的高度:",rect.height,",面积:", rect.area)
运行如图: