构造方法
属性(成员变量)的赋值
在上述代码中,为对象的属性赋值需要依次进行,略显繁琐,可以使用更高效的方式,对属性进行赋值
- 需要使用构造方法:__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