1.面向对象编程思想
1.面向过程编程 - 逻辑+基本语法
2.函数式编程 - 函数+逻辑+基本语法
3.面向对象编程- 类和对象 + 函数+逻辑+基本语法
2.类和对象
类就是拥有相同属性和相同功能的对象的集合(抽象的)
对象是类的实例 (具体)
人类: 有名字、有年龄、有性别、有肤色,会说话,能思考,可以睡觉
class Person:
def __init__(self):
self.name = ''
self.age = 0
self.sex = '男'
self.color = '黄'
def speak(self):
print('说话')
def think(self):
print('思考')
def sleep(self):
print('睡觉')
- 定义类(创建类)
class 类名:
类的说明文档
类的内容
说明:
类名 - 第一个字母大写,单词采用驼峰式命名(单词之间首字母大写)
类的内容 - 描述当前这个类是拥有哪些共同属性(变量)和哪些共同功能(函数)的对象的集合
包括属性和方法两个部分;
属性:对象属性和类属性两种
方法:对象方法、类方法、静态方法三种
方法: 定义在类中的函数就叫方法
class Dog:
"""狗类"""
def cry_out(self):
print('汪汪汪!')
- 创建对象
语法:
对象 = 类名()
dog = Dog()
3.对象方法
class 类名:
类属性
对象属性
对象方法
类方法
静态方法
1.对象方法
怎么定义:直接在类中定义函数
怎么调用:通过’对象.'的形式来调用
特点:有一个自带的参数self,这个参数在调用的时候不用传参,因为系统会自动将当前对象传self(谁调用self就指向谁)
class Student:
def study(self, subject):
# self = stu
print('self:', self)
print('学习!', subject)
stu = Student()
print('stu:', stu)
stu.study('Python')
# list1 = [10, 23, 34]
# list1.append(100)
1.构造方法
方法名和类名一样并且是用来创建对象的方法就叫构造方法。
python中在定义类的时候,系统会自动帮我创建好这个类的构造方法。
2.初始化方法 - _init_
- 当调用构造方法创建对象的时候,系统会自动调用这个类的__init__方法
- 创建对象的时候构造方法需不需要参数需要几个,参数类中的__init__方法除了self以外有没有额外的参数有几个
class Person:
def __init__(self):
print('self:', self)
print('初始化')
p1 = Person() # 创建一个新的Person对象; Person对象.__init__(); 返回Person对象
print('p1:', p1)
# p2 = Person()
class Dog:
def __init__(self, x, y):
print('狗的初始化:', x, y)
dog1 = Dog(10, 20)
4.类中属性
属性分为类属性和对象属性两种
1)类属性(字段)
怎么定义:直接定义在类中的变量就是类属性
怎么使用:通过’类.'的形式来使用
什么时候用:不会因为对象不同而不一样的属性就需要定义成类属性,例如:圆类中的圆周率
2)对象属性
怎么定义:以 ‘self.属性名=值’ 的形式定义在 __init__方法中。
怎么使用:通过’对象.'的形式来使用
什么时候用:会因为对象不同而不一样的属性就需要定义成对象属性:例如:人类的姓名、年龄、性别;圆的半径
class Person:
# a和num是类属性
a = 10
num = 61
def __init__(self):
# name、age、gender是对象属性
self.name = '张三'
self.age = 18
self.gender = '男'
print(Person.a)
p1 = Person()
print(p1.name, p1.age, p1.gender)
p2 = Person()
p2.name = '小明'
p2.age = 20
print(p2.name, p2.age)
- 对象属性默认的值赋值方式
1)给一个固定的默认值:用于对于这个类来讲,绝大部分对象对应的这个属性值都是同一个值
)给一个没有默认值的参数
3)给一个有默认值的参数
class Dog:
def __init__(self, name, breed='土狗', color='白色'):
self.name = name
self.age = 2
self.breed = breed
self.color = color
# __repr__方法的返回值是什么,打印Dog对象的时候就打印什么。返回值必须是字符串
def __repr__(self):
# 打印谁self就指向谁
# self=dog1
return f'name:{self.name}, age:{self.age}, breed:{self.breed}, color:{self.color}'
dog1 = Dog('大黄', color='黄色')
print(dog1) # print(dog1.__repr__())
dog2 = Dog('花花', '泰迪', '黄色')
dog2.age = 3
print(dog2)
- 方法 - 类中的函数
1)对象方法
怎么定义:直接定义在类中的函数
怎么调用:通过对象来调用
特点:自带参数self,调用的时候self不需要传参,系统会自动将当前对象传self(谁调用指向谁)
什么时候用:如果实现函数的功能需要对象属性就定义成对象方法
2)类方法
怎么定义:在类中定义函数前加装饰:@classmethod
怎么调用:通过类来调用
特点:自带参数cls,调用的时候cls不需要传参,系统会自动将当前类传给cls
什么时候用:实现函数功能的时候在不需要对象属性的前提下需要类,就定义成类方法
3)静态方法
怎么定义:在类中定义函数前加装饰:@staticmethod
怎么调用:通过类来调用
特点:没有默认参数
什么时候用:实现函数的功能既不需要对象也不需要类
class Circle:
pi = 3.1415926
def __init__(self, r):
self.r = r
def area(self):
# self = c1; self=c2
return self.r ** 2 * Circle.pi # c1.r ** 2 * 3.2415926
@classmethod
def show_pi(cls):
print('圆周率:', cls.pi)
@classmethod
def create_circles(cls, count):
circles = []
for _ in range(count):
circles.append(cls(1))
return circles
@staticmethod
def message():
print('静态方法', Circle.pi)
c1 = Circle(10)
print(c1.r)
print(c1.area())
c2 = Circle(1)
print(c2.area())
Circle.show_pi()
print(Circle)
print(Circle.create_circles(4))
Circle.message()
作业
1.定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rectangle:
def __init__(self, length,wide):
self.length = length
self.wide = wide
print('长为:',length,'宽为:',wide)
def perimeter(self):
return (self.length+self.wide)*2
def area(self):
return self.length*self.wide
a = Rectangle(1,2)
print(a.perimeter())
print(a.area())
2.定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Coordinates:
def __init__(self,a:tuple,b:tuple):
self.x = a[0]
self.y = a[1]
self.x1 = b[0]
self.y1 = b[1]
def distance(self):
return ((self.x-self.x1)**2+(self.y-self.y1)**2)**0.5
b1 = Coordinates((1,5),(1,1))
print(b1.distance())
3.定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class ExteriorContact:
pi = 3.1415926
def __init__(self,o1:tuple,r1,o2:tuple,r2):
self.x = o1[0]
self.y = o1[1]
self.x1 = o2[0]
self.y1 = o2[1]
self.r1 = r1
self.r2 = r2
def perimeter(self):
return ExteriorContact.pi*self.r1*2
def area(self):
return (ExteriorContact.pi*self.r1)**2
def exteriorcontact(self):
if ((self.x-self.x1)**2+(self.y-self.y1)**2)**0.5 == self.r1+self.r2:
return '两个圆外切'
else:
return '两个圆不外切'
b1 = ExteriorContact((1,5),3,(1,1),2)
print(b1.exteriorcontact())
4.定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Coordinates:
def __init__(self,a:tuple,b:tuple):
self.x = a[0]
self.y = a[1]
self.x1 = b[0]
self.y1 = b[1]
def distance(self):
return ((self.x-self.x1)**2+(self.y-self.y1)**2)**0.5
b1 = Coordinates((1,5),(1,1))
print(b1.distance())
5.定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Dog:
def __init__(self,name='傻🐶',gender='公狗',breed='二哈'):
self.name = name
self.breed = breed
self.gender = gender
@classmethod
def cry(cls):
print('🐶🦶')
def __repr__(self):
return f'name:{self.name},gender:{self.gender},breed:{self.breed}'
class Human:
def __init__(self,name='来福',age=12,dog='二哈'):
self.name = name
self.age = age
self.dog = dog
@classmethod
def run_dog(cls):
print('🐶🐶---🏃🏃♀️')
def __repr__(self):
return f'name:{self.name},age:{self.age},dog:{self.dog}'
d = Dog()
print(d)
Dog.cry()
e = Human()
print(e)
Human.run_dog()