day 18
一、类和对象
1、认识类和对象
什么是类:类就是拥有相同功能和相同属性的对象的集合
什么是对象:对象就是类的实例
2、创建类 : 用代码来描述清楚这个类是拥有哪些相同功能以及哪些相同属性的对象的集合
功能 - 函数
属性(数据) - 变量
语法: class 类名: 类的说明文档 类的内容 说明: class - 关键字;固定写法 类名 - 由程序员自己命名,必须满足两个要求:a.标识符 b.不是关键字 三个规范:a.见名知义 b.采用驼峰式命名,第一个字母必须大写 c.不使用系统的函数名、类名和模块名。 说明文档 - 本质就是多行注释 类的内容 - 包含属性和方法,属性分为对象属性和类属性两种;方法(本质是函数)分为对象方法、类方法、和静态方法三种。
3、创建对象
语法:
类名()
二、对象方法
class 类名:
类的说明文档
类的内容(对象方法、类方法、静态方法+对象属性、类属性)
1、对象方法
方法指的就是定义在类中的函数
1)怎么定义 :直接定义在类中函数就是对象方法
2)怎么调用: 通过‘对象.xx()’的形式来调用
3)特点:每个对象方法都有一个默认参数self,在通过对象调用对象方法的时候self不需要传参
系统会自动将当前对象传给self(self谁调用就指向谁)
定义一个类
class Person:
# 在类中定义一个类方法
def eat(self):
# p1.eat(): self=p1
# p2.eat(): self=p2
print('吃饭')
print(self)
创建对象P1
p1 = Person()
通过对象调用对象方法
p1.eat()
print(f'p1:{p1}')
print('=================================')
2.初始化方法 - init
'''
__init__ 是python类中一个特殊的对象方法,也是魔法方法。
魔法方法:类中方法以 __开头以__结尾的方法都是魔法方法,魔法方法全部都是系统自带的。
魔法方法不需要程序员主动调用,系统会在特定的情况下自动调用。
1): __init__方法会在创建对象的时候会被自动调用的
2): 通过类创建对象的时候需不需要参数,需要几个参数,由类中的__init__决定
'''
class Dog:
def __init__(self):
print('初始化')
dog1 = Dog()
dog2 = Dog()
三、属性
1.类中的属性
定义类就是用代码来描述这个类是拥有哪些相同特征的事物的总和。
如果特征是通过数据来体现的,那么这种特征就用属性来表示。
1)类属性
a.怎么定义:直接定义在类中的变量就是类属性
b.怎么使用:通过‘类.xx’的方式使用
c.什么时候用:属性值不会因为对象不同而不一样的时候就使用类属性
2)对象属性
a.怎么定义:以’self.xx=值’的形式定义在__init__方法中
b.怎么使用:通过‘对象.xx’的方式来使用
c.什么时候用:属性值会因为对象不同而不一样的时候就使用对象属性
class A:
# a 、name是一个属性
a = 10
name = '小明'
# b 和gender是对象属性
def __init__(self):
self.b = 10
self.gender = '男'
# 使用类属性
print(A.a)
print(A.name)
# 使用对象属性
x = A()
print(x.a)
print(x.name)
print('==================')
class Abc():
i=100
name='李明'
def __init__(self):
self.x=200
self.name1='李华'
print(Abc.name)
print(Abc.i)
p1=Abc()
print(p1.x)
print(p1.name1)
四、方法
1.方法
1)对象方法
a.怎么定义:直接定义
b.怎么调用:对象.xx()
c.特点:参数self,不需要传参,指向当前对象
d.什么时候用:如果实现函数的功能需要用到对象属性,就使用对象方法
2)类方法
a.怎么定义:定义函数前加@classmethod装饰器
b.怎么调用:类.xx()
c.特点:自带参数cls,调用的时候不用传参,系统会自动将当前类传给cls
d.什么时候用:在不需要对象属性的情况下需要类就是用类方法
3)静态方法
a.怎么定义:定义函数前加@staticmethod装饰器
b.怎么调用:类.xx()
c.特点:没有特点-没有默认参数
d.什么时候用:实现函数功能既不需要类也不需要对象就是用静态方法
class A():
def func1(self):
print('对象方法')
@classmethod
def func2(cls):
print('类方法')
@staticmethod
def func3():
print('静态方法')
#调用对象方法
a=A()
a.func1()
#调用类方法
A.func2()
#调用静态方法
A.func3()
五、对象属性的增删改查
class Student:
# __slots__ = ('name','age','stuid','score')
def __init__(self, name, stuid, age=18):
self.name = name
self.age = age
self.stuid = stuid
self.score = 0
# 当通过print打印当前类的对象的时候,这个方法会被自动调用,并且在打印的时候会打印这个方法的返回值(返回值必须是字符串)
def __repr__(self):
# return f'学号:{self.stuid} 姓名:{self.name} 年龄:{self.age} 分数:{self.score}'
return f'<{str(self.__dict__)[1:-1]}>'
stu1 = Student('小明', 'stu001')
stu2 = Student('小华', 'stu002', 19)
print(stu1)
print(stu2)
1.查 - 获取属性值
对象.对象属性 - 获取指定属性对应的值,如果属性不存在,报错
getattr(对象,属性名) - 获取指定属性对应的值,如果属性不存在,报错
getattr(对象,属性名,默认值) - 获取指定属性对应的值,如果属性不存在不报错返回默认值
print(stu1.name)
print(getattr(stu1, 'name'))
# getattr 可以动态确定获取的是哪种属性的值
# value = input('请输入需要获取的属性名字:')
# print(getattr(stu1, value))
2.增、改
对象.属性=值 - 如果属性存在就修改指定属性的值,如果属性不存在就添加属性
setattr(对象,属性名,值) -如果属性存在就修改指定属性的值,如果属性不存在就添加属性
stu1.name='张三'
print(stu1)
stu1.height=180
print(stu1)
setattr(stu1,'name','李四')
print(stu1)
setattr(stu1,'weight',70)
print(stu1)
3.删除
def 对象.属性
delattr(对象,属性名)
del stu1.height
print(stu1)
delattr(stu1,'age')
print(stu1)
class B():
#__slots__可以约束当前类的对象最多能拥有哪些对象属性
__slots__ = ('x','y','z')
def __init__(self):
self.x=10
# self.t=100
b=B()
print(b.x)
