类
在面向对象的语言中,万物皆对象,而这些个对象,根据其特点,又可以归为某一类。对于这一类可以定义相应的对象,这一过程称为实例化。这一类所对应的对象具有相同的属性,或者行为方法。例如:定义一个人类,他所实例化的对象都有着相同的属性:身高、性别、姓名等。也有相同的行为方法,比如吃饭、睡觉等。
创建类和实例
创建类
首先,我们创建一个简单的人类。在python中,类的关键字是Class。我们这个人(Person)类中,属性有姓名、年龄。方法有吃饭,睡觉。
''' 此处我们定义的一个Person类 '''
class Person():
'''
__init__ 是一个特殊方法,在用类实例化对象时会被自动调用
self是第一个参数,代表着实例本身,在方法中,可利用self调用对应的属性或方法,在方法调用时self不用手动传递。
name和age是需要传递的两个形参
self.name和self.age是类的两个属性。
'''
def __init__(self, name, age):
self.name = name
self.age = age
''' eat和sleep 是两个比较简单的方法,调用时不需要传参,self是自动传入的 '''
def eat(self):
print("{} is now eatting".format(self.name.title()))
def sleep(self):
print("{} is now sleeping".format(self.name.title()))
创建实例
# 调用类名创建对象,传入的两个参数分别对应__init__中的name,age。
person = Person("zhangsan", 20)
print(type(person))
class '__main__.Person'>
- 访问对象属性
可以使用.句点访问,对象的成员属性。
例如:person.name
# title()是字符串首字母大写的一个方法
print("my name is {}.".format(person.name.title()))
# {:d} 数字十进制输出的占位符
print("I am {:d} years old.".format(person.age))
my name is Zhangsan.
I am 20 years old.
- 调用方法
方式和调用属性一样,使用.句点。
person.eat()
person.sleep()
Zhangsan is now eatting
Zhangsan is now sleeping
- 创建多个实例对象
# person 和 person1是两个不同的人对象
person = Person("zhangsan", 20)
person1 = Person("lisi", 25)
print("person name is {}.".format(person.name.title()))
print("person am {:d} years old.".format(person.age))
person.eat()
print("\n")
print("person1 name is {}.".format(person1.name.title()))
print("person1 am {:d} years old.".format(person1.age))
person name is Zhangsan.
person am 20 years old.
Zhangsan is now eatting
person1 name is Lisi.
person1 am 25 years old.
Lisi is now sleeping
用户类
定义一个User类,其中包含属性:用户名、密码、年龄、性别。方法包括:获取用户信息、修改用户名、修改密码。其他方法可自行扩展
class User():
# 此处passwd是一个默认参数,即默认密码123456
def __init__(self, name, sex, age, passwd = "123456"):
self.user_name = name
self.sex = sex
self.age = age
self.passwd = passwd
def get_user_info(self):
return self.user_name, self.sex, self.age, self.passwd
def update_user_name(self, name):
self.user_name = name
# 此处加一简单逻辑,需要原密码判断,可自行尝试,如:可重试三次,密码强度校验等功能
def update_user_passwd(self, passwd):
old_passwd = input("请输入原密码:")
if old_passwd == self.passwd:
self.passwd = passwd
print("密码修改成功")
else:
print("原密码错误,修改失败")
user1 = User("lisi", "男", 24)
user_info = user1.get_user_info()
print(user_info)
user1.update_user_name("zhangsan")
user_info = user.get_user_info()
print("修改用户名后:")
print(user_info)
user1.update_user_passwd("q12q23")
先写个错误密码
('lisi', '男', 24, '123456')
修改用户名后:
('zhangsan', '男', 24, '123456')
请输入原密码:1234
原密码错误,修改失败
修改密码后:
('zhangsan', '男', 24, '123456')
再写个正确密码
('lisi', '男', 24, '123456')
修改用户名后:
('zhangsan', '男', 24, '123456')
请输入原密码:123456
密码修改成功
修改密码后:
('zhangsan', '男', 24, 'q12q23')
- 修改成员属性
user1 = User("lisi", "男", 24)
user_info = user1.get_user_info()
print(user_info)
user1.age = 25
user_info = user1.get_user_info()
print("修改年龄后:")
print(user_info)
('lisi', '男', 24, '123456')
修改年龄后:
('lisi', '男', 25, '123456')
继承
在定义类时,类名后面的括号可以为空,表示从空白开始建立一个类;也可以写上另一个类名,表示当前定义的类继承括号中的类。其中,当前类称为子类,被继承的类称为父类。
子类的初始化
class UserVip(User):
def __init__(self, name, sex, age, passwd = "123456"):
super().__init__(name, sex, age, passwd)
user = UserVip("lisi", "男", 32)
print(user.get_user_info())
('lisi', '男', 32, '123456')
super()
是一个特殊函数,帮助将父类和子类关联起来,后面另说。
子类特有属性和方法
子类除继承父类的属性和方法外,也可以自己定义属性和方法。
class UserVip(User):
def __init__(self, name, sex, age, level = 1, passwd = "123456"):
super().__init__(name, sex, age, passwd)
# level是vip用户特有的属性
self.level = level
# get_vip_user_info用于获取VIP用户的信息
def get_vip_user_info(self):
return self.user_name, self.sex, self.age, self.passwd, self.level
user = UserVip("lisi", "男", 32,3)
print(user.get_vip_user_info())
('lisi', '男', 32, '123456', 3)
重写父类的方法
class UserVip(User):
def __init__(self, name, sex, age, level = 1, passwd = "123456"):
super().__init__(name, sex, age, passwd)
# level是vip用户特有的属性
self.level = level
# get_user_info方法被重写,多返回一个VIP等级
def get_user_info(self):
return self.user_name, self.sex, self.age, self.passwd, self.level
user = UserVip("lisi", "男", 32,3)
print(user.get_user_info())
('lisi', '男', 32, '123456', 3)
将一个实例作为属性
# VipCard是新定义的会员卡类
class VipCard():
def __init__(self, card_num, money):
self.card_num = card_num
self.money = money
def vip_card_info(self):
return self.card_num, self.money
class UserVip(User):
def __init__(self, name, sex, age, card_num, money, level = 1, passwd = "123456"):
super().__init__(name, sex, age, passwd)
self.level = level
# 实例化一个会员卡实例,赋值给一个会员的卡属性
self.card = VipCard(card_num, money)
def get_user_info(self):
return self.user_name, self.sex, self.age, self.passwd, self.level
user = UserVip("lisi", "男", 32, "N00001", 1000, 3)
print("会员信息:")
print(user.get_user_info())
print("会员卡信息:")
# 调用获取会员卡信息的方法,获取到会员卡信息
print(user.card.vip_card_info())