语法:
class 类型名称: # 声明类型即声明一种数据类型
"""类型的文档注释"""
def __init__(self): # 对象的特征属性
"""声明属性的方法"""
pass
def 类型中的方法(self): # 对象的方法行为
pass
# 声明人类型:
class Person:
"""人的类型"""
# 初始属性,姓名,性别,身份
def __init__(self, name, gender, position): # 初始属性
self.name = name
self.gender = gender
self.position = position
# 娱乐的行为
def entertainment(self, item):
if item == "drum":
print("渔阳鼙鼓动地来")
elif item == "dance":
print("惊破《霓裳羽衣曲》")
else:
print("骊宫高处入青云,仙乐风飘处处闻")
语法:
引用变量 = 类型名称( 属性参数列表)
创建了一个指定类型的对象,将对象在内存中的地址赋值给一个引用变量。
# 创建对象(续2.1中代码)
# 引用变量 = 类型名称(属性参数)
emperor = Person("李隆基", "男", "皇帝", "唐玄宗")
emperor_wife = Person("杨玉环", "女", "贵妃", "杨贵妃")
# 操作对象的属性(续2.2代码):
# 获取数据: 引用变量.属性名称
print(emperor.name) # 李隆基
print(emperor_wife.nickname) # 杨贵妃
# 修改(或新增)数据:对象的引用变量.属性名称 = 新的数据
# 尽量避免用该方法新增数据
emperor.name = "唐明皇"
print(emperor.name) # 唐明皇
# 操作对象的方法(续3.1代码):
# 引用变量.方法名称([参数])
emperor_wife.grow_up() # 杨家有女初长成,养在深闺人未识。
emperor.entertainment("drum") # 渔阳鼙鼓动地来
emperor.entertainment("dance") # 惊破《霓裳羽衣曲》
访问:
修改(新增):
对象实例属性操作类属性(避免此操作):
class Person:
"""人的类型"""
# 类属性
nationality = "唐"
# 可变数据类属性
entertainment = ["渔阳鼙鼓动地来"]
# 创建对象
emperor = Person()
emperor_wife = Person()
# 可以通过类型名称访问:类名.类属性变量
print(Person.nationality) # 唐
# 可以通过对象直接访问:对象变量.类属性变量
print(emperor.nationality) # 唐
# 修改(没有改变量则会新增)
# 只能通过类型名称修改:类名.类属性变量 = 数据
Person.nationality = "大唐"
print(Person.nationality) # 大唐
print(emperor.nationality) # 大唐 # 实例中的类属性也被修改
# 对象实例属性扩展(避免此操作)
# 对象变量.类属性变量 = 数据
# 对象变量.新属性变量 = 数据
# 以上两种方式只改变该对象中的数据,类属性没有被修改
emperor.nationality = "唐朝"
print(emperor.nationality) # 唐朝(只是添加属性)
print(emperor_wife.nationality) # 大唐 # 其他对象的类属性不会被修改
print(Person.nationality) # 大唐 # 类属性没有被修改
emperor.country = "唐朝" # 只是新增和类属性值相等的对象属性,不修改原来类属性
print(emperor.country) # 唐朝
print(Person.nationality) # 大唐
# print(emperor_wife.country) # 没有该属性,会报错
# print(Person.country) # 没有该属性,会报错
emperor.entertainment.append("惊破《霓裳羽衣曲》") # 实例中修改可变类型中的数据
print(Person.entertainment) # ['渔阳鼙鼓动地来', '惊破《霓裳羽衣曲》'] # 类属性也实际被修改
emperor.entertainment = ["缓歌慢舞凝丝竹", "尽日君王看不足"] # 实例给可变类型重新赋值
print(Person.entertainment) # ['渔阳鼙鼓动地来', '惊破《霓裳羽衣曲》'] # 只是给实例对象添加属性,类属性没有被修改
魔术方法是类型中从object继承(继承见下一篇文章)过来的,使用双下划线开头和结尾,具有特殊功能的方法
直接打印前面创建好的对象,会得到地址:
print(emperor) # <__main__.Person object at 0x000002B9BA53DC88>
在4的类定义的代码上,添加__str__(self)方法:
class Person:
"""人的类型"""
# 类属性
nationality = "唐"
# 初始属性,姓名,性别,身份,称呼
def __init__(self, name, gender, position, nickname): # 初始属性
self.name = name
self.gender = gender
self.position = position
self.nickname = nickname
# __str__()方法:
def __str__(self):
"""对象打印的方法"""
return f"这是对象实例 {self.name}"
# 成长的行为
def grow_up(self):
print("杨家有女初长成,养在深闺人未识。")
# 娱乐的行为
def entertainment(self, item):
if item == "drum":
print("渔阳鼙鼓动地来")
elif item == "dance":
print("惊破《霓裳羽衣曲》")
else:
print("骊宫高处入青云,仙乐风飘处处闻")
再打印对象:
# 打印对象
print(emperor) # 这是对象实例 李隆基
print(emperor_wife) # 这是对象实例 杨玉环
此时如果对象在组合数据中,打印组数据又会显示内存地址:
lst = [emperor, emperor_wife]
print(lst) # [<__main__.Person object at 0x000002C675DCDDC8>, <__main__.Person object at 0x000002C675E42108>]
继续上面类定义的代码上,添加__repr__(self)方法:
class Person:
"""人的类型"""
# 类属性
nationality = "唐"
# 初始属性,姓名,性别,身份,称呼
def __init__(self, name, gender, position, nickname): # 初始属性
self.name = name
self.gender = gender
self.position = position
self.nickname = nickname
# __str__()方法:
def __str__(self):
"""对象打印的方法"""
return f"这是对象实例 {self.name}"
# __repr__()方法
def __repr__(self):
"""对象包含在组合数据类型中的打印方法"""
return f"这是对象实例 {self.name}"
# 成长的行为
def grow_up(self):
print("杨家有女初长成,养在深闺人未识。")
# 娱乐的行为
def entertainment(self, item):
if item == "drum":
print("渔阳鼙鼓动地来")
elif item == "dance":
print("惊破《霓裳羽衣曲》")
else:
print("骊宫高处入青云,仙乐风飘处处闻")
再次打印,则会按照自定义方式展示:
# 对象包含在组合数据类型中打印
lst = [emperor, emperor_wife]
print(lst) # [这是对象实例 李隆基, 这是对象实例 杨玉环]
对象构建:
对象打印:
对象比较:
四则运算:
增量运算:
函数式调用:
对象删除:
查看属性:
部分魔术方法举例:
class Person:
"""人的类型"""
# 初始属性
def __init__(self, name, age): # 初始属性
self.name = name
self.age = age
def __le__(self, other):
"""小于等于other返回结果"""
if self.age <= other.age:
return True
return False
def __cmp__(self, other):
if self.age > other.age:
return 1
elif self.age < other.age:
return -1
else:
return 0
def __floordiv__(self, other):
"""除法,向下取整"""
return self.age // other.age
def __call__(self, *args, **kwargs):
"""函数式调用"""
print(args, kwargs)
print(f"{self.name} 年龄 {self.age}")
li = Person("李隆基", 52)
yang = Person("杨玉环", 18)
print(li.__cmp__(yang)) # 1
print(li >= yang) # True
print(li // yang) # 2
yang("回眸一笑百媚生,六宫粉黛无颜色。")
# ('回眸一笑百媚生,六宫粉黛无颜色。',) {}
# 杨玉环 年龄 18