文章目录
一、概念
Python面向对象分为,类
和对象
两种,并且分为属性和方法
类是抽象的,对象是具体的,有类才有对象
举例:
学生类
属性(静态):姓名、年龄、性别、班级
方法(动态):学习、玩耍
学生对象:
属性(静态):张志涵、12岁、女、6年级
属性(方法):去图书馆学习、周末公园玩耍
二、定义
#定义学生类
class Students:
#定义属性
name = ""
age = 0
gander = ""
grand = 0
#定义方法
def learn(self):
print("学习")
def play(self):
print("玩耍")
#函数在类里面就叫做方法
#创建学生对象
stu1 = Students()
stu1.name = "张志涵"
stu1.age = 12
stu1.gander = "女"
stu1.grand = "6年级"
#stu1就是一个对象
#调用方法
stu1.learn()
输出:学习
三、构造函数 __init__(这里下划线是各两个)
方便一行创建对象
class Students:
#初始化属性
def __init__(self,name,age,gander,grand):
self.name = name
self.age = age
self.gander = gander
self.grand = grand
#定义普通(函数)方法
def learn(self):
print("我经常去图书馆学习")
def play(self,where):
print("我周末喜欢去公园玩耍"+where)
#创建对象
stu1 = Students("张志涵",12,"女",6)
print(stu1.name)
stu1.learn()
stu1.play("上海")
输出结果:
张志涵
我经常去图书馆学习
我周末喜欢去公园玩耍上海
四、属性私有化封装(用于简单加密,让属性无法直接调用)
#下面举例一个银行卡类(用户名,密码,余额):
class Cards:
def __init__(self,account,password,balance):
self.account = account
self.password = password
self.__balance = balance #余额被私有化
def deposit(self):
print("进行存款")
def getBlance(self,account,password):
if self.account = account and self.password = password:
return self.__balance
c = Cards("abc123","8888","5000")
*************下面是几种调用例子*************
a = c.balance
print(a)
#a这里会报错,因为无法直接调用
*************
b = c.getBalance("abc123","8888")
print(b)
#b这里就可以直接输出5000
*************
d = c.getBlance("abc123","0000")
print(d)
#d这里就无法查询,输出None
*************
e = c._Cards__balance
print(e)
#e这里就可以直接调用输出5000
五、继承(用于减少代码的重用,减少代码的冗余)
#创建父类
class Person:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def personInfo(self):
print("姓名"+self.name+"年龄"+str(self.age)+"性别"+self.gender)
#创建Farmers子类
class Farmers(Person):
def __init__(self,job,place):
self.job = job
self.place = place
def personInfo(self):
print("我是农民,我的工作是:"+self.job+"\n我的工作地点是:"+self.place)
#创建Scientists子类
class Scientists(Person)
def inventionM(self):
print("袁隆平发明了杂交水稻")
#创建Teacher子类
class Teacher(Person):
def __init__(self,name,age,gender,tall):
super().__init__(name,age,gender)
self.tall = tall
def personInfo(self):
print(self.name,"老师今年",self.age,"岁",sep="")
print(self.name, "老师是", self.gender, "的,身高:", self.tall, sep="")
#开始调用
f = Farmers("种田","东北")
f.personInfo()
输出结果:
我是农民,我的工作是:种田
我的工作地点是:东北
s = Scientists("袁隆平",90,"男")
s.personInfo()
输出结果:
姓名袁隆平年龄90性别男
t = Teacher("刘小东",40,"男",175)
t.personInfo()
输出结果:
刘小东老师今年40岁
刘小东老师是男的,身高:175
- 子类继承父类的
属性
,可以使用super().__init__
的写法来继承,这样可以省略一部分代码。 - 假如要使用 super() 继承父类的属性,
必须要继承全部
,不能只继承一部分,只继承一部分会报错。
六、抽象类
- 只能被继承,不能实例化(创建对象)
- 抽象类中有抽象方法,子类继承抽象类父类,必须要实现父类的抽象方法
- 定义抽象类导入abc模块:
import abc
格式如下:
class 类名(metaclass abc.ABCMeta):
#定义方法,无方法体,需要加上@abc.abstractmethod
def 方法名(self):
pass
举例:
import abc
class animals(metaclass=abc.ABCMeta):
#普通方法
def __init__(self,name,color):
self.name = name
self.color = color
#抽象方法
@abc.abstractmethod
def eat(self):
pass
下面是错误示范
#创建子类
class dogs(animals):
pass
#创建对象
d = dogs("大黄","black")
#这里会报错,因为子类必须重写 eat() 这个抽象方法才能创建对象
下面是正确示范
#创建子类
class dogs(animals):
def eat(self):
print("啃骨头")
#创建对象
d = dogs("大黄","black")
d.eat()
#不报错,这里就能成功输出