1. 类和对象 类--对一类事物的抽象 没有实际意义 对象---真实客观存在的 类的实例化 类的具体化
类的定义
Class 类名(大驼峰命名,首字母大写),默认继承object,可以多继承
2.编写一个类 两类内容:属性---变量 行为--函数(方法)
属性 自我独有--成员属性(属于对象) 大家共享的----类属性(属于类)
行为 自我独有的--成员方法(属于对象) 大家共享的---类方法 普通函数不容许出现在类里面,方法必须是类方法或成员方法
3.构造函数 初始化函数 __init__ 不写,缺省构造器 初始化基本数据,对象被创建出来之前执行,尽量不要做业务处理
<1>.成员变量赋值
<2>.关键成员变量的创建
<3>.self永远指向当前对象自身,代表当前对象自身,等同于java的this
<4>.类方法的cls代表当前类自身
class Student(object):
school = '中国python职业技术学院'
def __init__(self, name, age=0):
# 右边的name 是传参的name,左边的自定义的,把外面传进来的name 赋予给 self.name变量
self.name = name
self.age = age
self.high = 0.0
self.score = [99, 88, 77]
def study(self):
print(f'我是{self.name},我爱学习')
def jump(self):
print(f'我是{self.name},我爱跑步')
# 类方法
@classmethod
def love_school(cls):
print(f"我爱{cls.school}")
@classmethod
def address(cls):
cls.love_school()
创建一个Student对象
zhangsan = Student(name = '张三')
lisi = Student(name= '李四')
1.获取成员变量,通过对象来获取
print(zhangsan.name)
#张三
2.修改成员变量属性,通过对象来修改,只对当前对象有效:
zhangsan.name='张四'
print(zhangsan.name)
#张四
3.调用成员方法,通过对象来调用,类不能调用成员方法,成员方法可以访问成员变量,类变量,调用类方法,调用成员方法
#<1>.通过对象调用成员方法study
zhangsan.study()
#我是张四,我爱学习
#<2>.类名不能调用成员方法
#通过Student类调用成员方法study
Student.study()
提示错误:
TypeError: study() missing 1 required positional argument: 'self'
#<3>.成员方法可以访问成员变量:
def jump(self):
#可以访问成员变量name属性
print(f'我是{self.name},我爱跑步')
zhangsan.jump()
输出:我是张四,我爱跑步
#<4>.成员方法可以访问类变量:
def get_school(self):
#访问类变量school
print(self.school)
#<5>.成员方法可以调用类方法:
# 类方法
@classmethod
def love_school(cls):
print(f"我爱{cls.school}")
#成员方法
def study(self):
#调用类方法
self.love_school()
zhangsan.study()
输出:
#我爱中国python职业技术学院
#<6>.成员方法可以调用成员方法
#成员方法A:
def study(self):
print(f'我是{self.name},我爱学习')
#成员方法B:
def jump(self):
#可以直接调用study方法
self.study()
zhangsan.jump()
输出:
我是张四,我爱学习
4.获取类变量:
<1>.通过对象来获取:
print(zhangsan.school)
#中国python职业技术学院
<2>. 通过类名来获取:
print(Student.school)
#中国python职业技术学院
5.修改类变量:
<1>.通过对象来修改,只对当前对象生效,其他对象不生效:
zhangsan.school='中国java学院'
print(zhangsan.school)
'中国java学院'
print(lisi.school)
'中国python职业技术学院'
<2>.通过类名来修改,所有的对象都生效:
Student.school = '中国C++学院'
print(zhangsan.school)
#中国c++学院
print(lisi.school)
#中国c++学院
6.类方法定义,方法头上需要加@classmethod 注解,方法传参cls,cls代表当前类自身,可以访问类变量,可以调用其他的类方法,类无权获取成员变量,无法调用成员方法
#<1>.类方法定义
@classmethod
def love_school(cls):
#可以通过当前类cls访问类变量school
print(f"我爱{cls.school}")
#<2>.调用其他的类方法
#类方法A:
@classmethod
def love_school(cls):
print(f"我爱{cls.school}")
#类方法B:
@classmethod
def address(cls):
cls.love_school()
#通过对象名调用类方法:
zhangsan.address()
#我爱中国python职业技术学院
#<3>. 类无法获取成员变量:
@classmethod
def address(cls):
print(cls.name)
zhangsan.address()
调用address方法会报错:
AttributeError: type object 'Student' has no attribute 'name'
#<4>. 类无法调用成员方法:
@classmethod
def address(cls):
#通过类调用成员方法study
cls.study()
#调用类方法:
zhangsan.address()
输出:
TypeError: study() missing 1 required positional argument: 'self'
7.类方法调用,通过类名来调用,或者通过对象来调用
# 1.通过对象来调用
zhangsan=Student(name='张三')
zhangsan.love_school()
# 2.通过类名来调用
Student.love_school()
8.静态方法,staticmethod ,可以访问类变量,通过类名或对象去调用,不能访问成员变量和成员方法,不需要传参
@staticmethod
def static_song():
print(f'我爱{Student.school}')
#调用:
Student.static_song()
zhangsan.static_song()
9.重写string方法,打印对象时,按照__str__方法格式展示
def __str__(self):
return f'{self.school}-{self.id}-{self.name}'
print(zhangsan)
#中国python职业技术学院-1-zhangsan
10.如果方法不需要使用成员变量,那么既可以定义成类方法,也可以定义成成员方法,如果需要使用成员变量,那么只能定义成成员方法
11.如果类里面定义了__len__()方法,那么可以对其取长度
#假设对对象的年龄取长度
def __len__(self):
return self.age
#调用方法:
zhangsan = Student(name = '张三',age=10)
print(len(zhangsan)
#10
12.类外部的方法,需要访问类内部的成本变量和类变量
# 把类对象当作参数,类的外部方法
def hello_my_school(obj):
print(f'我是{obj.name},我爱我的母校:{obj.school}')
# 调用类外部方法 hello_my_school
lisi = Student(id=1, name='lisi', age=10)
hello_my_school(lisi)
#输出:
# 我是lisi,我爱我的母校:中国python职业技术学院
13. __getitem__ 按索引取值,获取对象的索引值
def __getitem__(self, item):
return self.score[item]
zhangsan = Student(name='张三')
print(zhangsan[-1])
#77