在Python里定义类
栗子~
class Person:
'''
a class of person.
'''
# 类里面所需的常量
n = 10 # 静态属性
# 初始化方法
def __init__(self, name, age):
# 对象的属性, 比如一个人有名字和年龄
self.name = name # 动态属性
self.age = age # 动态属性
# 对象的行为, 比如打招呼
def say_hi(self):
return "hi"
来看看怎么调用叭~
因为我在jupyter notebook里面跑的代码块, print都被省略了!
# 调用类里面的常量
Person.n # 10
# 创建实例
p = Person("Amy", 16)
p.name # 'Amy'
p.age # 16
p.say_hi() # 'hi'
# 另一种调用方法
Person.say_hi(p) # 'hi'
接下来看看给类和对象添加属性~
# 给类添加属性
Person.sex = "Female"
p.sex # "Female"
检查一下类里面是不是有sex这个属性了@.@
# 给实例添加属性
p.characteristic = "shy"
也检查一下:
继承inheritance
单继承
# student class 继承 Person class
class Student(Person):
def __init__(self, grade, name, age): # 在姓名年龄的基础上添加成绩属性
self.grade = grade
# 因为要继承Person的init方法, 以下两行代码二选一使用
# Person.__init__(self, name, age) # 单继承两个都能用, 多继承必须用这个
super().__init__(name, age)
# 创建一个根据成绩评等级的方法
def level(self):
if self.grade >= 90:
return "A"
elif self.grade >= 80:
return "B"
elif self.grade >= 70:
return "C"
else:
return "F"
# 查看父类:
Student.__base__ # __main__.Person
# 调用父类属性
Student.n # 10
# 新建student实例
s = Student(85, p.name, p.age)
s.level() # 'B'
s.say_hi() # 'hi'
多继承
class Father():
def __init__(self):
print("爸爸有一些性格, 比如: 固执")
def hobbie(self):
return "爸爸喜欢打球"
class Mother():
def __init__(self):
print("妈妈有一些性格, 比如: 内敛")
def hobbie(self):
return "妈妈喜欢弹琴"
class Me(Father, Mother):
def __init__(self):
print("我继承了爸爸妈妈的部分性格, 也有自己独立的性格")
Father.__init__(self)
Mother.__init__(self)
来新建一个实例:
me = Me()
输出:
我继承了爸爸妈妈的部分性格, 也有自己独立的性格
爸爸有一些性格, 比如: 固执
妈妈有一些性格, 比如: 内敛
# 查看继承优先级
Me.__mro__
(main.Me, main.Father, main.Mother, object)
# 当父类方法有冲突时会调用优先级高的方法
me.hobbie()
‘爸爸喜欢打球’
多态polymorphism
定义: 允许不同class的对象调用同一个方法,也可以说是一个方法可以接受不同类型的输入。一个很有名的例子:
其实因为我们在写python方法的时候不需要像java一样去确定输入参数类型,所以python的方法天生就是多态的。比如:
def add_one(x):
return x+1
就这么一个简单的方法,我们的x可以是整数类也可以是小数类,这就是一种多态的表现。
封装encapsulation
定义:将部分属性和方法私有化,从而起到保护的作用。用变量名前添加两个下划线来实现,举个栗子:
从上图我们不难看出从class的外部是无法访问name这个属性的~ (只能在这个class里面用!)