26.构造方法

构造方法

属性(成员变量)的赋值

在上述代码中,为对象的属性赋值需要依次进行,略显繁琐,可以使用更高效的方式,对属性进行赋值

  • 需要使用构造方法:__init__()

Python类可以使用:__init__()方法,称之为构造方法

可以实现:

  • 在创建类对象(构造类)的时候,会自动执行
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用

构造方法注意事项:

  • 构造方法名称: __init__ 前后都有2个下划线,不要写错
  • 构造方法也是成员方法,不要忘记在参数列表中提供:self
  • 在构造方法内定义成员变量,需要使用self关键字
class Student:
    name = None   # 姓名
    gender = None  # 性别
    nationality = None  # 国籍

    def __init__(self, name, gender, nationality):
        self.name = name            # 上述属性变量可以省略,如果存在则是对上述成员变量进行赋值,省略则是对成员变量进行变明并赋值
        self.gender = gender
        self.nationality = nationality

stu = Student("堂", "男", "中国")
print(stu.name)
# 简洁写法,省略成员变量声明,在方法里面直接声明并赋值
class Student:
    def __init__(self, name, gender, nationality):
        self.name = name
        self.gender = gender
        self.nationality = nationality

stu = Student("堂", "男", "中国")
print(stu.nationality)
中国

练习

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

for i in range(1,3):
    stu_list = []
    stu_list.append(f"stu{i}")
    for stu in stu_list:
        stu = Student(input("请输入你的姓名:"), int(input("请输入您的年龄:")), input("请输入您的地址:"))
        print(stu.name, stu.age, stu.adress)
堂1 18 杭州
堂2 20 杭州

魔术方法

上述学习的__init__构造方法,是Python类内置的方法之一

这些内置的类方法,各自有各自特殊的功能,这些内置的方法称之为:魔术方法

常见:

  • __init__  构造方法
  • __str__  字符串方法
  • __lt__  小于、大于符号比较
  • __le__  小于等于、大于等于符号比较
  • __eq__  ==符号比较

__str__ 字符串方法

当类对象需要被转换为字符串时,会输出对象的内存地址

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
stu = Student("堂", 18)
print(stu)
print(str(stu))
<__main__.Student object at 0x00000239A581D850>
<__main__.Student object at 0x00000239A581D850>
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"Student类对象,name={self.name},age={self.age}"
stu = Student("堂", 18)
print(stu)
print(str(stu))
Student类对象,name=堂,age=18
Student类对象,name=堂,age=18

__lt__ 小于、大于符号比较方法

直接对2个对象进行比较是不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号和大于符号2种比较

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __lt__(self, other):
        return self.age < other.age

stu1 = Student("堂", 18)
stu2 = Student("堂2", 20)
# print(stu1 < stu2)  ## 不使用\_\_lt\_\_ 报错TypeError: '<' not supported between instances of 'Student' and 'Student'
print(stu1 < stu2)   # True
print(stu1 > stu2)   # False
True
False

__le__ 小于等于、大于等于符号比较

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __le__(self, other):
        return self.age <= other.age

stu1 = Student("堂", 18)
stu2 = Student("堂2", 19)
print(stu1 <= stu2)   # True
print(stu1 >= stu2)   # False
True
False

__eq__ ==符号比较

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __eq__(self, other):
        return self.age == other.age

stu1 = Student("堂", 18)
stu2 = Student("堂2", 19)
print(stu1 == stu2)   # False
False