Day 14
在遇到问题时,直接用算法或步骤解决问题
在遇到问题时,考虑现有函数能否解决问题,有则用,无则自定义
在遇到问题时,考虑一个对象是否拥有解决这个问题的功能,有则用,无则自定义
类就是拥有相同功能和相同属性的对象的集合(抽象的概念)
对象就是类的实例
两者相互对应,一个类可以有多个对象
定义类
语法:
class 类名: 类的说明文档 类的内容说明:
class 固定写法类名程序员自定义(1.必须是标识符2.不是关键字)用驼峰命名法且首字母大写说明文档类的说明注释类的内容包括方法(对象方法、类方法和静态方法)和属性(对象属性和类属性)方法:
方法本质就是定义在类中的函数,用来对类的功能进行描述
属性:
属性就是在类中保存数据的变量,用来对类的属性进行描述
class Person: """ """ def sleep(self): print('sleep') def eat(self): print('eat') # 定义对象 ''' 类名() ''' p1 = Person() p2 = Person() print(p1, p2)对象方法就是直接定义在类中的函数
对象方法自带self参数,用对象调用方法时参数self不需要传参,系统会自动将当前对象传给self(谁调用就指向谁)
通过" 对象.方法名 "的形式来调用
class Dog: def eat(self, food='bloon'): print(f'self:{self}') print(f'eat {food}') # 创建一个Dog类的对象,保存在d1中 d1 = Dog() print(f'd1:{d1}') # 通过对象条用对象方法 d1.eat() d1.eat('shit')构造函数(方法)
函数名和类同名,专门用来创建对象的函数就是构造函数(方法)
class Person: pass # Person()就是一个函数但是我们并没有定义这个函数,系统在我们定义类时已经帮我们自动创建了一个同名函数 p = Person() ''':伪代码(Python中调用构造函数创建对象的时候完成的操作) def Person(*args, **kwargs): 对象 = 创建对象 - 1.调用__new__函数创建对象 对象.__init__(*args, **kwargs) - 2.调用__init__方法,对对象进行初始化 return 对象 - 3.返回初始化完成后的对象 '''init方法
魔法方法:类中用__开头和__结尾的方法
init方法会被系统在特定情况下自动调用(不需要程序员手动调用)
__init__:每次通过类创建对象的时候,系统都会自动调用这个方法
创建对象的时候构造函数的参数数量与init方法出self以外的参数数量对应
如果需要给类添加init方法只需要保证__init__为方法名,方法的性质位对象方法
class PersonPro: def __init__(self, *args, **kwargs): print('init方法被调用') p1 = PersonPro() p2 = PersonPro()类属性(类的字段)
定义:直接定义在类中但在函数外的变量使用:通过" 类.属性名(变量名)"的形式来调用应用场景:属性值不会因为对象不同而改变的属性使用类属性对象属性
定义:以" self.属性名 = 值"的形式定义在__init__方法中使用:以" 对象.属性名 "的形式来调用应用场景:属性会因为对象不同而改变的属性使用对象属性 class Person: # num是一个类属性 num = 100 def func1(self): print('此函数被调用') # _不是类属性 _ = 100 # 类属性的调用 print(Person.num) # a是一个类属性 a = 'abc' # name和age就是对象属性 def __init__(self, name, gender='不明'): print('init函数被调用') self.name = name self.age = '默认值' self.gender = gender # 类属性的调用 print(Person.a, Person.num) # 对象属性的调用 p = Person('xiaoming') # 创建对象 print(p.name, p.age, p.gender) p.gender = 'male' print(p.gender) # 练习:定义一个点类,属性:x坐标、y坐标,方法:打印当前点的信息(x,y) # 要求:创建点对象的时候可以给坐标赋值,不赋值时坐标为(0,0) # 添加方法:获取当前点到另外一个点的距离 import math class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def stamp(self): print(f'点的坐标为:({self.x},{self.y})') def step(self, other): distance = math.hypot(self.x-other.x, self.y-other.y) print('两点之间的距离为:', distance) dot1 = Point() dot1.stamp() dot2 = Point(10, 20) dot2.stamp() dot3 = Point(13, 16) dot3.step(dot2)