Class Abc(object):
def xxx():
pass
Class Abc:
def xxx():
pass
1、私有变量
类变量可以被外部调用并改动值
class Cat(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "我的名字叫{},今年{}岁".format(self.name,self.age)
xiaobai = Cat("小白",10)
print(xiaobai)
xiaobai.age=20
print(xiaobai)
此时小白的年龄会被改动,为了防止这种在外部改动的方法,我们可以使用私有属性,__xxx ,定义对象时在前面加上两个_即可,此时该属性(__xxx)只能被该类里面的方法去调用
# -*- coding: utf-8 -*-
class Cat(object):
def __init__(self, name, age):
self.name = name
self.__age = age
def __str__(self):
return "我的名字叫{},今年{}岁".format(self.name,self.__age)
def change_age(self, new_age):
self.__age = new_age
xiaobai = Cat("小白",10)
print(xiaobai)
xiaobai.age=20
print(xiaobai)
# 此时调用内部方法去改动
xiaobai.change_age(12)
print(xiaobai)
可以看到小白年龄被成功修改
2、私有方法
跟私有对象同理,不能直接 类名.__方法调用
此时会报错找不到这个__change_age方法,该方法是私有方法,只能被类里面的其他方法调用,例如change_age_new
# -*- coding: utf-8 -*-
class Cat(object):
def __init__(self, name, age):
self.name = name
self.__age = age
def __str__(self):
return "我的名字叫{},今年{}岁".format(self.name,self.__age)
def __change_age(self, new_age):
self.__age = new_age
def change_age_new(self, new_age):
if new_age > 0:
self.__change_age(new_age)
xiaobai = Cat("小白",10)
print(xiaobai)
xiaobai.change_age_new(-5)
print(xiaobai)
xiaobai.change_age_new(20)
print(xiaobai)
3、对象关联
例如 有一个班级叫 room3-2 ,班里有 张三、李四、王五、郑六四位学生,班级与学生存在关联关系
此时我们给班级新建一个方法,用于 添加学生进入班级
则可以通过班级类查看学生类下信息,person.name实际调用的是student类中的self.name属性
4、继承
① 单继承
()里面填需要继承的父类即可
# 定义父类
class baba():
def tezheng(self):
print("我有6只手")
# 定义子类 继承baba父类
class erzi(baba):
pass
laowang = erzi()
laowang.tezheng()
此时laowang继承baba类,该对象也有6只手
② 多继承
()里面填需要继承的父类即可
class baba():
def baba_tezheng(self):
print("我有6只手")
class mama():
def mama_tezheng(self):
print("我有6条腿")
# 定义子类 继承baba和mama两个父类
class erzi(baba,mama):
pass
laowang = erzi()
laowang.baba_tezheng()
laowang.mama_tezheng()
③ 多态
# 定义父类
class baba():
def __init__(self,name):
self.name=name
def tezheng(self):
print("我有6只手")
class mama():
def __init__(self,name):
self.name=name
def tezheng(self):
print("我有6条腿")
# 定义子类 继承baba和mama两个父类
class erzi(baba,mama):
def __init__(self,name):
self.name=name
def erzi_tezheng(self,who):
print("儿子继承了{}的特征".format(who.name))
who.tezheng()
laowang = erzi("老王")
wangmama = mama("王妈妈")
wangbaba = baba("王爸爸")
laowang.erzi_tezheng(wangmama)
laowang.erzi_tezheng(wangbaba)
这里传入mama则继承mama的,传入baba就继承baba的,这就是多态
④ 重写
即子类覆盖父类方法,子类与父类方法名称相同即可覆盖
# 定义父类
class baba():
def __init__(self,name):
self.name=name
def tezheng(self):
print("我有6只手")
# 定义子类 继承baba和mama两个父类
class erzi(baba):
def __init__(self,name):
self.name=name
def tezheng(self):
print("{}有7条腿".format(self.name))
laowang = erzi("老王")
laowang.tezheng()
注释子类同名方法后,即继承父类方法
⑤ super
继承父类方法,同时还能使用自己的方法。即在父类方法的基础上新增功能。
class baba():
def __init__(self,name):
self.name=name
def tezheng(self):
print("{}我有6只手".format(self.name))
# 定义子类 继承baba父类
class erzi(baba):
def __init__(self,name):
self.name=name
def tezheng(self):
super().tezheng()
print("{}有7条腿".format(self.name))
wangbaba = baba("王爸爸")
laowang = erzi("老王")
laowang.tezheng()
5、类属性
class Person():
def __init__(self,name):
self.name = name
zhangsan = Person("张三")
lisi = Person("李四")
wangwu = Person("王五")
zhengliu = Person("郑六")
例如我要统计 一共都多少个人,但是如果在方法里面直接计算,则会有问题
解决办法是设置一个类属性,类名+属性名定义类属性
6、类方法
类方法可以直接操作类属性
# 定义类方法规则模板
class xxx():
@classmethod
def yyy(cls):
pass
类方法,可以通过实例对象(zhangsan)调用,也可以通过类名(Person)去调