编程思想、类和对象
-
编程思想
# 1.面向过程编程(穷人思想) - 逻辑+基本语法 print(10 + 20) # 2.函数式编程(小资思想) - 函数+逻辑+基本语法 sum((10, 20)) def sum1(num1, num2): return num2 + num1 # 3.面向对象编程(富豪思想)- 类和对象+函数+逻辑+基本语法
-
类和对象
-
什么是类,什么是对象
""" 类就是拥有相同属性和相同功能的对象的集合(抽象的) 对象是类的实例 (类的具体) 人类: 有名字、有年龄、有性别、有肤色,会说话,能思考,可以睡觉 """ 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 类名: 类的说明文档 类的内容 说明: 类名 - 第一个字母大写,单词采用驼峰式命名(单词之间首字母大写) 类的内容 - 描述当前这个类是拥有哪些共同属性(变量)和哪些共同功能(函数)的对象的集合 包括属性和方法两个部分; 属性:对象属性和类属性两种 方法:对象方法、类方法、静态方法三种 方法: 定义在类中的函数就叫方法 """ class Dog: # 类名 """狗类""" #类的说明文档 def cry_out(self): #类的 对象方法 print('汪汪汪!')
-
创建对象
-
对象方法
""" 怎么定义:直接在类中定义函数 怎么调用:通过'对象.'的形式来调用 特点:有一个自带的参数self,这个参数在调用的时候不用传参,因为系统会自动将当前对象传self(谁调用self就指向谁) 语法: 对象 = 类名() """ dog = Dog() # 相当于创建变量作为一个对象, 来调用类里面的 对象方法 并获取返回值 # list1 = [10, 23, 34] # 类似 list列表这个类一样,都是用变量作为对象 来调用list这个类 # list1.append(100) class Student: def study(self, subject): # self = stu print('self:', self) print('学习!', subject) stu = Student() print('stu:', stu) stu.study('Python')
-
构造方法
""" 方法名和类名一样并且是用来创建对象的方法就叫构造方法。 python中在定义类的时候,系统会自动帮我创建好这个类的构造方法。 """
-
初始化方法 -
__init__
""" 1) 当调用构造方法创建对象的时候,系统会自动调用这个类的__init__方法 2) 创建对象的时候构造方法需不需要参数需要几个,参数类中的__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)
-
-
类的属性(属性分为
类属性
和对象属性
两种)""" 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)
-
对象属性默认的赋值方式
# 2. 对象属性默认的值赋值方式 # 1)给一个固定的默认值:用于对于这个类来讲,绝大部分对象对应的这个属性值都是同一个值 # 2)给一个没有默认值的参数 # 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) # 10 print(c1.area()) # 314.15926 c2 = Circle(1) print(c2.area()) #3.1415926 Circle.show_pi() print(Circle) # 圆周率: 3.1415926 print(Circle.create_circles(4)) Circle.message() # 静态方法 3.1415926
-
作业
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rectangle: '''''' def __init__(self, length, wide): self.length = length self.wide = wide # 周长 def perimeter(self): return (self.length + self.wide)*2 # 面积 def area(self): return self.wide * self.length cls1 = Rectangle(6, 7) print(cls1.area()) # 42 print(cls1.perimeter()) # 26
-
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class TwoDimensionalPoint: def __init__(self, initial_x=0, initial_y=0): self.x = initial_x self.y = initial_y def __repr__(self): return f'初始点为({self.x},{self.y})' # 点与点距离 def dot_distance(self, current_x, current_y): return ((current_x - self.x)**2 + (current_y - self.y)**2)**0.5 cls2 = TwoDimensionalPoint() print(cls2.dot_distance(2, 2)) #2.8284271247461903
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle: '''圆类''' pi = 3.14 def __init__(self, r, centre_dot_x = 0, centre_dot_y = 0): self.r = r self.centre_dot_x = centre_dot_x self.centre_dot_y = centre_dot_y # 求圆的周长 def circle_perimeter(self): return Circle.pi * self.r*2 # 求圆的面积 def circle_area(self): return Circle.pi * self.r ** 2 # 判断当前圆和另一个圆是否外切 def circle_combination(self, centre_x, centre_y, r): dot_distance = ((centre_x - self.centre_dot_x)**2 + (centre_y - self.centre_dot_y)**2)**0.5 if dot_distance == float(r)+float(self.r): print(f'圆心({self.centre_dot_x}, {self.centre_dot_y})圆与您输入的圆是外切') return print(f'圆心为({self.centre_dot_x}, {self.centre_dot_y})的圆与您输入的圆不是外切') csl3 = Circle(6, 5, 6) csl3.circle_combination(12, 0, 5) #圆心为(5, 6)的圆与您输入的圆不是外切
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Egment: '''线段类;origin和terminus参数为元组,两位''' def __init__(self, origin:tuple, terminus:tuple): self.origin = origin self.terminus = terminus # 获取线段的长度 def segment_length(self): return ((int(self.origin[0])-int(self.terminus[0]))**2 + (int(self.origin[1])-int(self.terminus[1]))**2)**0.5 cls4 = Egment((0, 0), (5, 9)) print(cls4.segment_length()) # 10.295630140987
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
class Dog1: '''狗类''' def __init__(self, name, breed, gender): self.name = name self.breed = breed self.gender = gender @classmethod def cry(cls): print('汪汪汪!')
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class People1: '''人类''' def __init__(self, name, age, dog = '二哈'): self.name = name self.age = age self.dog = dog def took_the_dog(self): return f'去溜{self.dog}咯!' cls5 = People1('阿宏', '18', dog='二哈哈') print(cls5.took_the_dog()) #去溜二哈哈咯!