76.类的定义
我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起”.
对象是类的具体实体,一般称为“类的实例”
。(比如一个 Student 类 创造了一个 实体 叫做 小李 。 小李 是一个学生。 就是这个 Student类的实例化对象。)
类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”。
从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法
),但会有自己的属 性值(不共享状态)
。更具体一点:“方法代码是共享的,属性数据不共享”。
Python中,“一切皆对象”
。类也称为“类对象”,类的实例也称为“实例对象”。
定义类的语法格式如下:
class 类名:
类体
要点如下:
类名
必须符合“标识符”的规则;一般规定,首字母大写
,多个单词使用“驼峰原则”
。- 类体中我们
可以定义属性和方法
。 属性用来描述数据
,方法(即函数)
用来描述这些数据相关的操作
。
【操作】一个典型的类的定义
# 创建一个类
class Student: # 类名 一般首字母大写 ,多个单词用驼峰原则
def __init__(self, name, score): # 方法,也就是函数
self.name = name # self 必须在 第一个
self.score = score # 这是 构造方法
def say_score(self): # self 必须位于第一位
print('{0}的分数是:{1}'.format(self.name, self.score))
# 这句的意思是 调用' _int_ '构建函数 ,'self'代表的自己,把student的地址传给'self'
s1 = Student('onepis', 100) # 通过类名()调用构造函数
# s1 就是一个 实例化对象。
onepis=Student('onepis',100)
s1.say_score() # 调用 此方法 输出 分数
# 添加年龄属性 和 工资 属性
s1.age = 32
s1.salary = 3000
print(s1.salary)
# 这叫实际例对象 S2
s2 = Student('litao', 100) # 新建的 s2 里面没 有 age 和 salary
# 所以 下面 5代码 会报错
# 类 创建的 对象s2 里面的 say_score 传递 self (注,self代表的就是实例化出来的对象) 找到 Student .方法(例如say_score)是一个行为,可以被 共享
# print(s2.age) # 报错
s2.say_score()
Student.say_score(s2) # 解释器 实际调用 是这样调用的
print(dir(s1)) # dir 获得对象所有的 属性
print('**********************')
print(s1.__dict__) # 获得我们直观的自己定义的属性
print(isinstance(s2, Student)) # s2是不是 Stundent 这个类型 的 实例对象(就是创造的饼干)
运行结果:
onepis的分数是:100
3000 # salary 工资
litao的分数是:100
litao的分数是:100
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'salary', 'say_score', 'score']
# 调用 dir 查看的所有属性
**********************
# 调用 .__dict__ 查看 我们自己创建的 属性。
{'name': 'onepis', 'score': 100, 'age': 32, 'salary': 3000}
True # 是Student 的 实例化 对象。