77.__init__构造方法和__new__方法(重要)
__init__
这一类下滑线的 我认为是魔术方法,也叫特殊方法。
具体可以查询此文档
类是抽象的,也称之为“对象的模板”。我们需要通过类这个模板,创建类的实例对象,然 后才能使用类定义的功能。
现在,我们可以更进一步的说,一个 Python 对象包含如下部分:
1.id
(identity 识别码)
2. type
(对象类型)
3. value
(对象的值)
1) 属性(attribute
)
2) 方法(method
)
创建对象,我们需要定义构造函数__init__()
方法。构造方法用于执行“实例对象的初始化工 作”
,即对象创建后,初始化当前对象的相关属性,无返回值
。
__init__()
的要点如下:
- 名称固定,必须为:
\_\_init\_\_()
第一个参数固定
,必须为:self
。self
指的就是刚刚创建好的实例对象。- 构造函数通常用来初始化实例对象的实例属性,如下代码就是初始化实例属性:name 和score。
class Student:
def __init__(self,name,score):
self.name = name #实例属性
self.score = score
class Student2:
def __init__(self,name,_id):
self.name=name
self._id=_id
- 通过“类名(参数列表)”来调用构造函数。调用后,将创建好的对象返回给相应的变量。 比如:
s1 = Student('张三', 80)
5.__init__()
方法:初始化创建好的对象,初始化指的是:“给实例属性赋值”
__new__()
方法: 用于创建对象,但我们一般无需重定义该方法。- 如果我们不定义
__init__
方法,系统会提供一个默认的__init__
方法。如果我们定义了带参 的__init__
方法,系统不创建默认的__init__
方法。
注:
- Python中的self 相当于C++中的 self 指针, JAVA和C#中的this 关键字。Python 中,
self
必须为构造函数的第一个参数,名字可以任意修改。但一般遵守惯例,都叫做self
。
可以回顾一下 上一节 的示例。
# 创建一个类
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 的 实例化 对象。