面向对象之封装
1、定义
class 类名:
"类文档字符串"
数据成员
行为成员
class Wife:
# 数据成员
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
# 行为成员
def play(self):
print("{}玩耍".format(self.name))
wife = Wife('莉莉', 19, '女')
wife.play()
2 、内存图
self是调用当前方法的对象地址
3、练习
class Student(object):
def __init__(self, name, age):
self.age = age
self.name = name
def showInfo(self):
print("姓名: %s, 年龄:%d" % (self.name, self.age))
stuList = []
while True:
name = input("输入姓名")
if name == "":
break
age = int(input("输入年龄"))
stu = Student(name, age)
stuList.append(stu)
for item in stuList:
item.showInfo()
4、类成员
定义:在类中定义的变量
使用:通过类名.变量名的方式进行使用(不建议通过对象名访问类变量)
class ICBC:
"""
工商银行
"""
total_money = 1000000
def __init__(self, name, money):
self.name = name
self.money = money
#从总行中扣除支行的金额
ICBC.total_money = ICBC.total_money - money
i01 = ICBC("上饶支行", 10000)
i02 = ICBC("景德镇支行", 10000)
print("总行还有%d" % (ICBC.total_money))
类变量被所有对象共享
5、类方法
定义
@classmethod
def 方法名称(cls, 参数列表):
方法体
调用:类名.方法名(参数列表)
作用:用于操作类变量
说明: 至少有一个形参,第一个形参用于绑定类
类方法只能访问变量,不能访问实例变量
实例方法可以通过类名访问类变量
class ICBC:
"""
工商银行
"""
total_money = 1000000
def __init__(self, name, money):
self.name = name
self.money = money
# 从总行中扣除支行的金额
ICBC.total_money = ICBC.total_money - money
@classmethod
def fun(cls):
print(cls.total_money)
print("总行还有%d" % (ICBC.total_money))
i01 = ICBC("王者支行", 10000)
i02 = ICBC("荣耀支行", 10000)
ICBC.fun()
练习
"""
练习:定义老婆类,创建3个老婆对象,统计个数。(对象计数器)
可以通过类变量记录老婆对象个数
可以通过类方法打印老婆对象个数
"""
class Wfie(object):
wifeCount = 0
def __init__(self, name, age):
self.name = name
self.age = age
Wfie.wifeCount += 1
@classmethod
def showWfieNo(cls):
print("wife 个数{}".format(cls.wifeCount))
wife = Wfie('zs', 10)
wife1 = Wfie('ls', 10)
Wfie.showWfieNo()
6、静态方法
list01 = [
["00", "01", "02", "03"],
["10", "11", "12", "13"],
["20", "21", "22", "23"]
]
class Vector2:
"""
二维向量
可以表示位置/方向
"""
def __init__(self, x, y):
self.x = x
self.y = y
@staticmethod
# 函数:表示左边方向
def left():
return Vector2(0, -1)
@staticmethod
def right():
return Vector2(0, 1)
# 作用:位置 + 方向
pos01 = Vector2(1, 2)
# 通过类名调用静态方法
l01 = Vector2.left()
pos01.x += l01.x
pos01.y += l01.y
print(pos01.x, pos01.y)
语法
如果一个方法里没有用到实例对象的任何属性,可以把这个方法定义成为静态方法。
需要通过装饰器@staticmethod来进行修饰。
静态方法既不需要传递类对象,也不需要传递实例对象(形参没有self/cls)。
静态方法也能够通过实例对象和类对象去访问,即对象名.类方法名()或类名.类方法名()
7、总结
实例方法:操作对象的数据
类方法:操作类的数据
静态方法:既不需要操作实例变量也不需要操作类变量