内容提纲
Python类
- 变量
- 类变量
- 实例变量
- 方法
- 实例方法
- 类方法
- 静态方法
- 构造函数
- 成员的可见性
- 面向对象3大特征:
- 继承性
- 封装性
- 多态性
- 类
- 类名称首字母大写
- 类内部 变量、函数
- 变量:称为数据成员,特征
- 函数:称为方法,行为
- 类最基本作用:封装
- 构造函数
- 用来生成不同的对象
- 初始化对象的属性
class Student(): #名称首字母大写
name = '' #数据成员 类变量
age = 0
def __init__(self,name,age): #实例化时自动运行构造函数
# 构造函数
self.name = name # 实例变量
self.age = age
def print_file(self): #self固定特征
print('姓名:'+ self.name)
print('年龄:' + self.age)
student = Student() #实例化一个类
student.print_file() #调用类下面的方法
方法和函数的区别
- 方法:设计层面
- 函数:程序运行、过程式的一种称谓
类变量和实例变量
- 类变量:和类关联在一起的
- 实例变量:和对象关联在一起的
class Student():
name = '李四'
def __init__(self,name):
self.name = name
print(self.name) # 打印的是实例变量
print(name) # 打印的是参数
print(Student.name) # 调用类变量
print(self.__class__.name) #调用类变量另一种方法
def do_homework(self):
print('home')
zs = Student('张三')
#打印结果
张三
张三
self与实例方法
- 类下面的实例方法,规定第一个参数必须是
self
- 调用实例方法时,不需要传入
self
参数
类方法
定义类方法:
@classmethod
装饰器cls
参数- 对象可以调用类方法,但是不建议这样做
- 类方法里面不能调用 实例变量
class ZhongYan():
pinpai = 0
def __init__(self,ppmc): # 构造函数
self.ppmc = ppmc
def guige(self): # 实例方法
pass
# 类方法
@classmethod # 装饰器
def ppsl(cls): # 约定俗成 cls 类参数
cls.pinpai += 1
print('中烟的品牌数量:' + str(cls.pinpai))
print(self.ppmc) # 类方法里面不能调用实例变量,会报错
henan = ZhongYan('黄金叶')
Zhongyan.ppsl()
Zhongyan.ppsl()
# 运行结果
中烟品牌数量:1
中烟品牌数量:2
静态方法
@staticmethod
装饰器- 不需要
self
或者cls
约定成俗的参数 - 对象和类都可以调用静态方法
- 静态方法 里面不能调用 实例变量
- 静态方法 不建议经常使用,当静态方法与类和实例关联性不大时,使用静态方法
class ZhongYan():
pinpai = 0
def __init__(self,ppmc): # 构造函数
self.ppmc = ppmc
def guige(self): # 实例方法
pass
# 类方法
@classmethod # 装饰器
def ppsl(cls): # 约定俗成 cls 类参数
cls.pinpai += 1
print('中烟的品牌数量:' + str(cls.pinpai))
@staticmethod # 装饰器
def add(x,y): # 参数不是self也不是cls
print('这是一个静态方法')
print(self.ppmc) # 静态方法里面不能调用 实例变量,这样会报错
成员的可见性
- 可见性:
- 变量
- 方法
- 其他语言区分公开和私有是在变量前面加上:
public
公开的private
私有的,外部无法读取或设置
- Python 变量或方法私有是在 前面加 两个下划线
__
- python并不存在私有机制,加双下划线后,python只是修改了名称,可以通过
_类__私有变量
来访问
- python并不存在私有机制,加双下划线后,python只是修改了名称,可以通过
- 内部外部
- 类内部
- 实例调用
继承
# 父类
class Renlei():
def __init__(self,name,age):
self.name = name
self.age = age
def pr_xinxi(self):
print(self.name)
# 子类继承
class Xuesheng(Renlei):
def __init__(self,name,age,banji):
self.banji = banji
#Renlei.__init__(self,name,age)
super(Xuesheng,self).__init__(name,age)
def pr_xinxi(self):
super(Xuesheng,self).pr_xinxi()
print(self.name,self.age,self.banji)
zs = Xuesheng('张三',18,'三班')
zs.pr_xinxi()