类是拥有相同功能和相同属性的对象的集合 - 抽象的概念
对象就是类的实例(类具体的表现)
定义类就是用代码描述这个类拥有哪些相同功能和相同属性的对象的集合
程序中描述功能:函数
程序中描述属性:变量
语法:
class 类名:
类的说明文档
类的内容
说明:
class - 关键字 固定写法
类名 - 程序员自己命名,采用驼峰命名法并且首字符大写(StudentName)
: - 固定写法
类的说明文档 - 多行注释
类的内容 - 相同功能和相同属性
由方法(对象方法,类方法,静态方法)和属性(对象属性,类属性)组成
方法 - 定义在类中的函数
属性 - 定义在类中的变量
class Person:
"人类"
age = 32 # num是属性
def eat(self): # eat是方法
print('吃饭')
def sleep(self): # sleep是方法
print('睡')
语法:
对象=类名() - 创建指定类对应的一个对象,并将对象返回
class Person:
"人类"
age = 32 # num是属性
# 创建两个对象
p1 = Person()
p2 = Person()
print(p1, p2)
类中的方法:类中的函数 用来描述具体的功能
方法类型 | 定义 | 调用 | 什么时候用 | 特点 |
---|---|---|---|---|
对象方法 | 将函数直接定义在类中 | 在类的外面 通过对象.xxx() 来调用 | 如果实现函数的功能需要用到对象属性就使用对象方法 | 自带参数self ,通过对象调用对象方法的时候不需要传参,系统自动将当前对象传给self (self,谁调用就指向谁) |
类方法 | 在类中定义函数的时候加装饰器@classmethod | 通过类名.xxx() 调用 | 如果实现函数的功能不需要用对象属性需要类就使用类方法 | 自带参数cls ,调用的时候不需要传参,系统自动将当前类传给cls (cls ,谁调用就指向谁) |
静态方法 | 在类中定义函数的时候加装饰器@staticmethod | 通过类名.xxx() 调用 | 既不需要用到对象属性也不需要用到类就用静态方法 | 没有特点 |
class A:
def fun(self):
print('对象方法')
@classmethod
def fun(cls):
print('类方法')
@staticmethod
def fun():
print('静态方法')
方法名以__
开头并且以__
结尾的自带的方法就是魔法方法
所有的魔法方法都会在特定的情况下被自动调用
方法名 | 作用 |
---|---|
__init__ | 每次创建类的对象的时候会自动调用类中的__init__ 方法创建类的对象的时候 参数和参数个数由类中的 __init__ 方法决定 |
__repr__ | 打印对象的时候自动调用 对象对应的类中的__repr__ 方法,该方法是定制打印规则(函数的返回值是什么,对象打印就是什么;返回值必须是返回值) |
class D:
def __repr__(self):
return 'abc'
d = D()
print(f'd:{d}') # d:abc
class E:
def __init__(self):
print('init方法')
pass
e1=E() # 每次创建对象的时候自动调用类中的__init__方法
class F:
# 在类中添加__init__方法的时候除了方法名和方法类型不能改变,可以随意添加参数函数体
def __init__(self,x,y):
print(x+y)
f1=F(1,2)
属性分类 | 创建 | 使用 | 什么时候用 |
---|---|---|---|
类属性 | 在类中直接定义一个变量 | 在外部使用 通过类.xxx 的方式 | 当属性值不会因为对象不同而不一样的时候就使用,反之就使用对象属性 |
对象属性 | 以self.属性名=值 的形式定义在类的__init__ 方法中 | 在外部使用 通过对象.属性名 使用 通过对象.属性名=新值 修改 | 当属性值会因为对象不同而不一样的时候就使用 |
class A:
x=100 # x是类属性
print(A.x) # 直接使用类属性 100
A.x=200 # 修改类属性的值
print(A.x) # 200
class B:
y=200
# name age gender 是对象属性
def __init__(self):
self.name='cindy'
self.age=15
self.gender='女'
b=B()
print(b.name,b.age,b.gender,b.y) # cindy 15 女 200
class Person:
def __init__(self, name, gender = '男'):
self.name = name # 通过没有默认值的参数来赋值
self.age = 1 # 赋固定值,创建对象时不能修改
self.gender = gender # 使用有默认值的参数来赋值,创建对象时可以修改
def __repr__(self):
# return f'name:{self.name},age:{self.age},gender:{self.gender}'
return str(self.__dict__) # 把打印对象转换成字典,然后在转换成字符串
p1 = Person('小明')
print(p1)
print(p1.name, p1.age, p1.gender)
p2 = Person('小花', '女')
print(p2)
print(p2.name, p2.age, p2.gender)
import math
class Circle:
pi=math.pi
def __init__(self,radiu):
self.radiu=radiu
def perimeter(self):
p=2*Circle.pi*self.radiu
return f'周长为:{p:.2f}'
# 在类中实现函数的功能的时候 如果需要的数据是属性则不需要提供额外的参数
# 类属性直接用类提供
# 对象属性直接用self提供
def area(self):
a=Circle.pi*self.radiu**2
return f'面积为:{a:.2f}'
circle1=Circle(3)
print(circle1.area())
print(circle1.perimeter())
class Rect:
def __init__(self,length,width):
self.length=length
self.width=width
def area(self):
return self.width*self.length
def perimeter(self):
return (self.length+self.width)*2
def __repr__(self):
# return f'长度:{self.length},宽度{self.width}'
return f'<{str(self.__dict__)[1:-1]}>'
r1=Rect(1,4)
print(r1)
stu={'name':'lili','age':19,'gender':'女'}
class Student:
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def __repr__(self):
return str(self.__dict__)[1:-1]
stu1=Student('小明',17,'男')
对象.属性 | 获取指定属性的值,属性不存在报错 |
getattr(对象,属性名) | 获取指定属性的值 属性不存在报错 |
getattr(对象,属性名,默认值) | 获取指定属性的值 属性不存在返回默认值 |
方法 | |
---|---|
对象.属性=值 | 属性存在修改属性值,属性不存在给对象添加属性 |
setattr(对象,属性名,值) | 属性存在修改属性值,属性不存在给对象添加属性 |
方法 | |
---|---|
del 对象.属性 | 删除指定属性 |
delattr(对象,属性名) | 删除指定属性 |
class Student:
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def __repr__(self):
return str(self.__dict__)[1:-1]
stu1=Student('小明',17,'男')
print(stu1)
delattr(stu1,'gender')
print(stu1)
hasattr
hasattr(对象,属性名,) 判断属性是否存在
注意:attr相关函数可以动态操作对象属性
继承就是让子类直接用拥有父类的属性和方法
父类是一个大类,子类就是大类中的一个小分类
class 类名(父类):
类的说明文档
类的内容
注意:定义类的时候,没有写父类的话默认继承object(基类)
子类在拥有父类的属性和方法的同时,往往需要有自己的一些属性和方法
class Person():
"""一个人类,作为父类"""
def __init__(self, name, age, sex):
"""父类初始化方法"""
self.name = name
self.age = age
self.sex = sex
def get_desc_info(self):
print("姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex)
class Student(Person):
"""一个学生类,作为子类"""
def __init__(self, name, age, sex):
"""子类初始化方法"""
# super.__init__(name, age, sex) # 错误示范
super().__init__(name,age,sex)
student = Student('林梓然', 26, '男')
student.get_desc_info()