面向对象基础
一,编程思想
三种编程思想:
1.面向过程编程
2.函数式编程
3.面向对象编程
二,认识类和对象
1.什么是类,什么是对象
类 - 类是拥有相同功能和相同属性的对象的集合。(是一个抽象的概念)
对象 - 对象是类的实例(是类的具体表现) (具体的)
从生活的角度:如果人是类,余婷就是对象、骆昊是另外一个对象
如果杯子是类,我手上的这个杯子就是对象
2. 定义类(创建类) - 用代码来描述清楚这个是到底是拥有哪些相同功能和哪些相同属性的对象的集合
语法:
class 类名:
类的说明文档
类的内容(包括方法和属性)
注解:方法 - 定义在类中的函数
属性 - 定义在类中变量
说明:
class - 关键字;固定写法
类名 - 由程序员自己命名,必须符合名要求和规范
要求:是标识符;不能是关键字
规范:见名知义;采用驼峰式命名(由多个单词组成,单词间通过首字母大写来区分),第一个字母大写;
不使用系统的函数名、类名或者模块名
类的说明文档 - 本质就是多行注释
类的内容 - 由方法和属性组成
方法包括:对象方法、类方法和静态方法三种
属性包括:类属性(字段)和对象属性两种
3. 创建对象
对象是类的实例,创建对象必须通过类来创建。
三,方法
类中的方法分为三种:对象方法、类方法、静态方法
1. 对象方法
1)怎么定义:直接定义在类中的函数就是对象方法
2)怎么调用:通过对象来调用 - 对象.对象方法()
3)特点:用对象调用对象方法的时候,参数self不需要传参,系统会自动将当前对象传给self(谁去调用的这个方法当前对象就是谁)
2. 类方法
1)怎么定义:定义函数前加@classmethod
2)怎么调用:通过类来调用 - 类.类方法()
3)特点:参数cls不需要传参,系统会自动将当前类传给cls
3. 静态方法
1)怎么定义:定义函数前加@staticmethod
2)怎么调用:通过类来调用 - 类.静态方法()
3)特点:没有特点
四,构造函数和Init方法
1.构造函数(了解) - 名字和类名一样,专门用来创建对象的函数就是构造函数
python中创建类的时候,系统会自动为我们创建这个类的构造函数。
补充:魔法方法的特点
1)方法名是__开头并以__结尾
2)魔法方法不需要程序员主动调用,在特定事件被触发后系统会自动调用
2.__init__方法
1)当通过类创建对象的时候,类中__init__方法会被自动调用
(每次通过类创建对象的时候,类中的__init__都会被自动调用)
2)通过类创建对象的时候需不需要参数,需要几个参数,由这个类中的__init__决定。(看__init__除了self以外有没有额外的参数)
五,属性
属性分为:对象属性和类属性(字段)
1. 类属性
1)怎么定义: 直接在类中定义一个变量,这个变量就是类属性
2)怎么使用: 通过类来使用 - 类.类属性
3)什么时候用: 属性不会因为对象不同而不一样就将这个属性定义成类属性
2. 对象属性
1)怎么定义: 以'self.属性名=值'的形式定义在__init__方法中
2)怎么使用: 通过对象来使用 - 对象.对象属性
3)什么时候用:属性会因为对象不同而不一样就将这个属性定义成对象属性
3. __init__方法的扩展
1)如果类需要对象对象属性,就需要在类中添加__init__
2)可以通过在__init__中添加参数来实现创建对象的时候直接给属性赋值
作业
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Dog : def __init__(self,name,gender,variety): self.name =name self.gender = gender self.variety = variety def cry_out(self) : return print('汪汪汪') class Human: def __init__(self,name,age,dog): self.name = name self.age =age self.dog =dog def walk_the_dog(self): return print('walk the dog')
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rectangle : def __init__(self,height,width): self.height =height self.width =width def perimeter(self): return (self.height + self.width) *2 def area (self): return self.height * self.width
-
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Coordinate_system: """ 坐标系类""" def __init__(self,coordinate1:tuple,coordinate2:tuple): """给的是两个坐标,类型是元组""" self.coordinate1 =coordinate1 self.coordinate2 =coordinate2 def distance(self): return (abs(self.coordinate1[0]-self.coordinate2[0])**2 + abs(self.coordinate1[1]-self.coordinate2[1])**2)**(1/2)
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle : pi = 3.141592653 def __init__(self,r1,coordinate1:tuple,r2,coordinate2:tuple): self.r1 = r1 self.coordinate1 = coordinate1 self.r2 = r2 self.coordinate2 = coordinate2 def area (self): return 2 * Circle.pi *self.r**2 def distance(self): return (abs(self.coordinate1[0] - self.coordinate2[0]) ** 2 + abs( self.coordinate1[1] - self.coordinate2[1]) ** 2) ** (1 / 2) def is_exterior_contact(self) : if Circle.distance(self)==self.r1 +self.r2 : print('这两个圆外切') else : print('这两个圆不外切') a = Circle(5,(0,0),5,(6,8)).is_exterior_contact()
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Segment: def __init__(self,s,e): self.s = s self.e = e def length(self): return abs(self.s-self.e) a=Segment(3,4).length() print(a)