回顾
- 正则语法
- 匹配类:
- 多行匹配,不能和\n匹配,单行匹配可以和\n匹配
- 检测类 \b \B ^ $
- 匹配几次 * + ? ()\N {N}
- 分组()和分支|
- 转义符合\
- re模块
from re import fullmatch match search finditer split sub I S
总结
类和对象
-
定义类(创建类)
''' 定义类用代码描述清楚你这个类是拥有那些相同功能那些相同属性的对象的集合 功能 -对应的是函数 属性- 保存数据的变量(再类中叫属性) 语法: class 类名: 类的说明文档 类的内容 说明: class - 关键字,固定写法 类名 -- 程序员自己命名 只能是字母 要求:是标识符,不是关键字 规范:见名知义;驼峰式命名(单词之间采用首字母大写)(不能下划线),首字母大写 : -- 固定写法 类的说明文档 - 本质就是多行注释 类的内容 - 包括属性和方法 属性分为:类属性(类的字段)和对象属性 方法分为:对象方法,类方法和静态方法 注:方法就是定义在类中的函数 ''' int class Student: ''' 学生类 ''' pass
-
定义对象(创建对象
''' 语法:类() ''' list() stu1 = Student() stu2 = Student()
对象方法
-
定义在类中的函数就是方法
-
对象方法
''' 怎么定义:直接定义在类中的函数(定义函数前不用加装饰器) 怎么调用: 用对象来调用=-对象点.函数名() 特殊:自带参数self ,再调用的时候self 不用传参,系统会自动将当前对象传给self(谁调用 ''' class Person: '''人类''' def sleep(self): print('睡觉') def eat(self,food): print(f'吃{food}') p1 = Person() #创建对象 p1.sleep()
构造方法和初始方法
- 构造函数/构造方法
-
函数名和类名相同,并且是用来创建对象的方法就是构造方法
-
python的构造函数再创建类的时候由系统自动创建,程序员只需要再创建对象的时候自动调取
# 1.构造函数/构造方法 # 函数名和类名相同,并且是用来创建对象的方法就是构造方法 # python的构造函数再创建的类的时候由系统自动创建,程序员只需要再创建对象的时候自动调取 ''' 定义类的时候可以根据需求再类中添加对象方法: __init__ 添加的时候要保证函数名是__init__,第一个参数是self,除此之外我们可以随意添加函数体和参数 每次使用类创建对象的时候,系统会自动调用这个类中的__init__方法 调用构造方法创建对象的时候需不需要参数,需要几个参数看这个类的__init__方法 除了self以外有没有额外的参数。 魔法方法:类中这个方法名由__开头并且以__结尾的方法就是魔法方法,所以的魔法方法都是自己调用 所有的魔法方法都已经写好了 都是固定的 '''
- 初始化方法 init
class Dog:
def __init__(self):
# 下面的这个函数的定义由系统自动完成
'''
def Dog():
pass xin新建好的对象 = 创建对象并且申请内存保存对象
新建好的对象.__init__()
return 新建好的对象
'''
# 补充:
# def __init__():
# pass
def __init__():
print('__init__')
# def Cat( ):
# pass
def Cat(*args,**kwargs):
__init__(*args,**kwargs)
cat1 = Cat()
属性方法
- 属性是用来描述类的数据特征。属性的本质是保存数据的变量。
- 对象属性和类属性
'''
1)类属性
怎么定义: 直接定义再类中的变量就是类属性
怎么使用: 同类来使用 类.类属性
什么时候用:属性的值不会因为对象不同而不一样,这种属性就是定义成类属性
2)对象属性
怎么定义:以'self.属性名=值'的形式定义在__init__方法中
怎么使用:通过对象来使用,对象.对象属性
什么时候用:属性的值会因为对象不同而不一样,这种属性就是定义成对象属性
'''
class Person:
# num 就是类属性
num = 34
# name age gender 对象属性
def __init__(self):
self.name = '小猫'
self.age = 18
self.gender= '男'
print(Person.num)
Person.num = 23
print(Person.num)
p1 = Person()
print(p1.name,p1.age,p1.gender)
p1.name = 'huahua'
print(p1.name)
- 对象属性赋初始值的三种方式
'''
方式1:赋一个固定的值,
方式2:使用没有默认值的参数赋值
方式3:使用有默认值的参数赋值
'''
class Dog:
def __init__(self,name,color,breed = '土狗',gender = '母'):
self.breed = breed
self.name = name #meiy没有默认值的参数
self.gender = gender
self.color = color
self.age = 1 #赋固定值
# __repr__方法在当前类的对象被打印的时候会被自动调用,这个方法的返回值(必须是字符串)是什么就打印什么
def __repr__(self):
# 打印谁,self就是谁
# return f'{self.name,self.breed,self.gender,self.color,self.age}'
# return str(self.__dict__)
return f'<{str(self.__dict__)[1:-1]}>'
dog1 = Dog('财产','黄色')
print(f'dog1:{dog1}')
dog2 = Dog('huahu','白色')
# 练习:定义一个商品类,拥有属性:价格、名称、产地、类型、生产日期、保质期
# 要求:创建对象的时候价格、名称、生产日期必须赋值; 其他属性可以赋值也可以不赋值,产地默认温州、保质期默认1年、类型默认是食品
# 打印对象的时候打印商品基本信息
class Goods():
def __init__(self,price,name,date,producing_area='温州',expirationdate=1,typee='食品'):
self.price = price
self.name = name
self.producing_area = producing_area
self.typee = typee
self.date = date
self.expirationdate= expirationdate
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
good1 =Goods(23,'gugu','2020-5-23')
print(f'Goods:{good1}')
方法
"""
1. 对象方法
怎么定义:直接在类中定义函数(函数前不加装饰器)
怎么调用:对象.对象方法()
特点:自带参数self, self不用传参,谁调用self就指向谁。
什么时候用:如果实现函数的功能需要用到对象,一定是对象方法
2. 类方法
怎么定义:在定义函数前加装饰器@classmethod
怎么调用:类.类方法()
特点:自带参数cls,cls不用传参,系统将当前类传个cls (谁调用就指向谁)
什么时候用:实现函数的功能,在不需要对象属性的时候需要类就使用类方法
3. 静态方法
怎么定义:在定义函数前加装饰器@staticmethod
怎么调用:类.静态方法
特点:没有默认参数
什么时候用:实现函数的功能既不需要当前类的对象也不需要当前类,就使用静态方法
"""
class Test:
def func1(self):
print('对象方法')
@classmethod
def func2(cls):
# cls = Test
print(f'cls: {cls}')
print('类方法')
@staticmethod
def func3():
print('静态方法')
t1 = Test()
# 用对象调用对象方法
t1.func1()
# 用类调用类方法
Test.func2()
print(f'Test:{Test}')
class Circle:
pi = 3.1415926
def __init__(self, radius):
self.radius = radius
def area(self):
return self.radius ** 2 * Circle.pi
@classmethod
def set_pi(cls, value):
cls.pi = value
作业
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class Dog(): def __init__(self,name,gender,breed): self.name= name self.gender = gender self.breed= breed # def __repr__(self): # return f'<{str(self.__dict__)[1: -1]}>' def call_out(self): return '叫唤' dog1 = Dog('汪汪','公','土狗') print(dog1.call_out()) class Person(): def __init__(self,name,age,dog): self.name= name self.age=age self.dog = dog def walk_the_dog(self): return f'快跑,{self.dog.name}' person1 = Person('小猫',18,dog1) # person1.dog=dog1 print(person1.walk_the_dog())
-
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rectangle(): def __init__(self,long,wide): self.long= long self.wide= wide def perimeter(self): return (self.long +self.wide) * 2 def sea(self): return self.long *self.wide rectangle1 = Rectangle(10,34) print(f'周长:{rectangle1.perimeter()},面积:{rectangle1.sea()}')
-
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Twodimension(): def __init__(self,x,y): self.x= x self.y= y def length(self, dimension): # return round(((y2-self.y)**2 + (x2-self.x)**2)**0.5,2) return round(((dimension.y-self.y)**2 + (dimension.x-self.x)**2)**0.5,2) twodimension1 = Twodimension(3,6) twodimension2 = Twodimension(13,18) print(twodimension1.length(twodimension2))
-
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle(): pi = 3.14159 def __init__(self, radius,center): self.radius= radius self.center= center def perimeter(self): return 2*self.pi*self.radius def sea(self): return self.pi*self.radius**2 def exterior_contact(self, circle2): center_distance_square = sum(list(map(lambda item1, item2: (item1-item2)**2, self.center, circle2.center))) sum_radius_square = (self.radius+circle2.radius) ** 2 if center_distance_square == sum_radius_square: return True else: return False circle1 = Circle(4,(2,4)) circle3 =Circle(4,(5,7)) print(circle1.exterior_contact(circle3)) print(circle1.perimeter(),circle1.sea())
-
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Segment(): def __init__(self, origin: Twodimension,destination: Twodimension): self.origin= origin self.destinationr= destination def length(self): return self.origin.length(self.destinationr) start = Twodimension(12, 34) end = Twodimension(-13, 4) seg1= Segment(start,end)