Python 构造器

原文:https://www.javatpoint.com/python-constructors

构造器是一种特殊类型的方法(函数),用于初始化类的实例成员。

在 C++或 Java 中,构造器与其类同名,但在 Python 中它对构造器的处理不同。它用于创建对象。

构造器可以有两种类型。

  1. 参数化构造器

  2. 非参数化构造器

构造器定义是在我们创建这个类的对象时执行的。构造器还验证对象是否有足够的资源来执行任何启动任务。

用 python 创建构造器

在 Python 中,方法 init() 模拟类的构造器。当类实例化时调用此方法。它接受self-关键字作为允许访问类的属性或方法的第一个参数。

我们可以在创建类对象时传递任意数量的参数,这取决于 init() 的定义。它主要用于初始化类属性。每个类都必须有一个构造器,即使它只是依赖于默认的构造器。

考虑下面的例子来初始化雇员类属性。

例子


class Employee:
def __init__(self, name, id):
self.id = id
self.name = name

def display(self):
print("ID: %d \nName: %s" % (self.id, self.name))

emp1 = Employee("John", 101)
emp2 = Employee("David", 102)

# accessing display() method to print employee 1 information

emp1.display()

# accessing display() method to print employee 2 information
emp2.display()

输出:

ID: 101 
Name: John
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

Python 非参数化构造器

当我们不想操作只有 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("John")

Python 参数化构造器

参数化构造器有多个参数以及自身。考虑下面的例子。

例子


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("John")
student.show()

输出:

This is parametrized constructor
Hello John

Python 默认构造器

当我们没有在类中包含构造器或者忘记声明它时,那么它就变成了默认的构造器。它不执行任何任务,但初始化对象。考虑下面的例子。

例子


class Student:
roll_num = 101
name = "Joseph"

def display(self):
print(self.roll_num,self.name)

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 对象访问。在内部,如果类有多个构造器,该类的对象将总是调用最后一个构造器。

注意:Python 中不允许构造器重载。

Python 内置的类函数

下表描述了类中定义的内置函数。

| 序号 | 功能 | 描述 |
| one | getattr(obj,name,default) | 它用于访问对象的属性。 |
| Two | setattr(obj、name、value) | 它用于为对象的特定属性设置特定值。 |
| three | delaattr(obj,name) | 它用于删除特定属性。 |
| four | hasattr(obj,name) | 如果对象包含某些特定属性,则返回 true。 |

例子


class Student:
def __init__(self, name, id, age):
self.name = name
self.id = id
self.age = age

# creates the object of the class Student
s = Student("John", 101, 22)

# prints the attribute name of the object s
print(getattr(s, 'name'))

# reset the value of attribute age to 23
setattr(s, "age", 23)

# prints the modified value of age
print(getattr(s, 'age'))

# prints true if the student contains the attribute with name id

print(hasattr(s, 'id'))
# deletes the attribute age
delattr(s, 'age')

# this will give an error since the attribute age has been deleted
print(s.age)

输出:

John
23
True
AttributeError: 'Student' object has no attribute 'age'

内置类属性

除了其他属性,Python 类还包含一些内置的类属性,这些属性提供了关于该类的信息。

下表给出了内置的类属性。

序号属性描述
onedict它提供了包含类命名空间信息的字典。
Twodoc它包含一个包含类文档的字符串
threename它用于访问类名。
fourmoudle它用于访问定义该类的模块。
fivebase它包含一个包含所有基类的元组。

例子


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("John",101,22)
print(s.__doc__)
print(s.__dict__)
print(s.__module__)

输出:

None
{'name': 'John', 'id': 101, 'age': 22}
__main__