构造函数是一种特殊的方法(函数),用于初始化类的实例成员。
在C ++或Java中,构造函数与其类具有相同的名称,但在Python中对构造函数的对待不同。它用于创建对象。
构造函数可以有两种类型。
- 参数化构造函数
- 非参数构造函数
创建构造函数
在Python中__ init __()方法模拟该类的构造函数。在实例化类时调用此方法。它接受 self -关键字作为第一个参数,该参数允许访问类的属性或方法。
根据 __ init __()的定义,在创建类对象时可以传递任意数量的参数。它主要用于初始化类属性。每个类都必须具有一个构造函数,即使它仅依赖于默认构造函数也是如此。
请考虑以下示例来初始化 Employee 类属性。
class Employee:
def __init__(self, name, id):
self.id = id
self.name = name
</span><span class="kwd">def</span><span class="pln"> display</span><span class="pun">(</span><span class="kwd">self</span><span class="pun">):</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"ID: %d \nName: %s"</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">id</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">name</span><span class="pun">))</span><span class="pln">
emp1 = Employee("Learnfk", 101)
emp2 = Employee("David", 102)
# 访问 display() 方法以打印员工 1 信息
emp1.display()
# 访问 display() 方法以打印员工 2 信息
emp2.display()
输出:
ID: 101 Name: Learnfk ID: 102 Name: David
当无涯教程创建类的对象时,构造函数会被自动调用。考虑以下示例。
class Student: count = 0 def __init__(self): Student.count = Student.count + 1 s1=Student() s2=Student() s3=Student() print("The number of students:",Student.count)
输出:
The number of students: 3
非参数构造函数
当不想操纵值或仅以self为参数的构造函数时,使用非参数化的构造函数。考虑以下示例。
class Student: # Constructor - non parameterized def __init__(self): print("This is non parametrized constructor") def show(self,name): print("Hello",name) student = Student() student.show("Learnfk")
参数化构造函数
参数化的构造函数具有多个参数以及 self 。考虑以下示例。
class Student: # Constructor - parameterized def __init__(self, name): print("This is parametrized constructor") self.name = name def show(self): print("Hello",self.name) student = Student("Learnfk") student.show()
输出:
This is parametrized constructor Hello Learnfk
默认构造函数
当不在类中包含构造函数或忘记声明它时,它将成为默认构造函数。它不执行任何任务,而是初始化对象。考虑以下示例。
class Student:
roll_num = 101
name = "Joseph"
</span><span class="kwd">def</span><span class="pln"> display</span><span class="pun">(</span><span class="kwd">self</span><span class="pun">):</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">roll_num</span><span class="pun">,</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">name</span><span class="pun">)</span><span class="pln">
st = Student()
st.display()
输出:
101 Joseph
多个构造器
让看另一种情况,如果在类中声明两个相同的构造函数,会发生什么情况。
class Student: def __init__(self): print("The First Constructor") def __init__(self): print("The second contructor")st = Student()
输出:
The Second Constructor
在上面的代码中,对象 st 称为第二个构造函数,而两者都具有相同的配置。 st 对象无法访问第一种方法。在内部,如果类具有多个构造函数,则该类的对象将始终调用最后一个构造函数。
内置类函数
下表中描述了该类中定义的内置函数。
| SN | 功能 | 说明 |
|---|---|---|
| 1 | getattr(obj,name,default) | 用于访问对象的属性。 |
| 2 | setattr(obj,name,value) | 用于将特定值设置为对象的特定属性。 |
| 3 | delattr(obj,name) | 它用于删除特定属性。 |
| 4 | hasattr(obj,name) | 如果对象包含某些特定属性,则返回true。 |
class Student:
def __init__(self, name, id, age):
self.name = name
self.id = id
self.age = age
</span><span class="com"># 创建类 Student 的对象</span><span class="pln">
s = Student("Learnfk", 101, 22)
#打印对象 s 的属性名称
print(getattr(s, name))
# 将属性 age 的值重置为 23
setattr(s, "age", 23)
#打印年龄的修改值
print(getattr(s, age))
#如果学生包含名称为 id 的属性,则打印 true
print(hasattr(s, id))
# 删除属性年龄
delattr(s, age)
# 这将给出一个错误,因为属性年龄已被删除
print(s.age)
输出:
Learnfk 23 True AttributeError: Student object has no attribute age
内置的类属性
除了其他属性,Python类还包含一些内置的类属性,这些属性提供有关该类的信息。
下表列出了内置的类属性。
| SN | 属性 | 说明 |
|---|---|---|
| 1 | __ dict __ | 它提供了包含有关类名称空间信息的字典。 |
| 2 | __ doc __ | 它包含一个带有类文档的字符串 |
| 3 | __ name __ | 用于访问类名。 |
| 4 | __ module __ | 用于访问在其中定义了此类的模块。 |
| 5 | __ bases __ | 它包含一个包含所有基类的元组。 |
class Student: def __init__(self,name,id,age): self.name = name; self.id = id; self.age = age def display_details(self): print("Name:%s, ID:%d, age:%d"%(self.name,self.id)) s = Student("Learnfk",101,22) print(s.__doc__) print(s.__dict__) print(s.__module__)
输出:
None
{name: Learnfk, id: 101, age: 22}
__main__