来源于:《Python3入门与进阶第九章》
面向对象编程入口
这一节的提纲:
问题一:什么是类?什么是对象?
类是现实世界或思维世界中的实体在计算机中的反映
它将数据以及这些数据上的操作封装在一起
类是抽象的,对象是具体的。
类由数据成员(刻画特征)和方法(刻画行为)组成
类实例化后,才是一个具体的对象。类就像模板(画笔 )一样,能够产生很多对象。
类负责定义和刻画,不负责执行
类最基本的作用:封装
问题二:方法和函数的区别?
方法:设计层面,
函数:程序运行,过程式的一种称谓
问题三:什么是构造函数?
构造函数__init__()
,可以看做是特殊的实例方法,行为和普通的实例方法几乎一样。
扫描二维码关注公众号,回复:
5120007 查看本文章
#区别1:调用方式不同,通过类调用构造函数。通过实例对象调用普通的实例方法
student1 = Student('石敢当',18) #实例化后,程序自动调用构造函数__init__()
student2 = Student('喜小乐',19)
student1.do_homework() #通过实例对象
student2.do_homework()
#区别2:
#实例方法是用来描述类的行为,构造函数的意义在初始化类的各种特征
问题四:什么是类变量和实例变量?
类变量是和类相关联在一起的
实例变量和对象相关联在一起的
#对象的查找机制
__dict__ #是一个字典,字典里面保存着当前对象所有的相关的变量
self与实例方法
1.定义实例方法时self必须出现
2.调用实例方法时不需要对self实际传参数
#实例方法是实例中可以调用的方法。最大的特点,第一个参数传入self
def do_homework(self):
print('homework')
def __init__(self,name,age):
self.name = name #实例变量
self.age = age
# print('student')
def do_homework(self):
print('homework')
self是和对象有关,和类是无关的。谁调用了这个方法,self就指代谁。换句话说,self代表的是实例,而不是类
def do_homework(self):
print('homework')
student1 = Student('石敢当',18) #实例化后,程序自动调用构造函数__init__()
student2 = Student('喜小乐',19)
student1.do_homework()
student2.do_homework()
问题:实例方法中如何访问类变量?
1.通过类名.变量名 print(Student.sum1)
2.通过self访问内置函数 print(self.__class__.sum1)
类方法classmethod
#问题:如何区分实例方法与类方法?
#看上面是否有装饰器@
#类方法主要作用:操作和类相关的一些变量
#在函数上面增加classmethod,就成为一个类方法
@classmethod #classmethod类方法
def plus_sum(cls): #cls就是class缩写。cls就是类本身
pass
#类方法可以操作类变量也可以操作实例变量,就像实例方法可以操作实力变量和类变量。
但最好还是各司其职。
静态方法
@staticmethod #静态方法
def add(x,y):
print('this is a static method')
student1.add(1,2) #静态方法被对象调用
Student.add(1,2) #静态方法被类调用
成员可见性 变量和方法的可见性
#人人都可以访问类方法,导致了类的不安全性
#公开的public 私有的 private
#其他语言中使用关键字:
public sum #表示sum是共有的
private sum #表示sum是私有的
python中私有变量与私有方法
__marking #前面有双下划线,表示私有化了,无法从外部调用私有方法。注意不要前后都加!!
最后一大节所有程序的笔记
class Student(): #建议类名首字母大写
name = 'qiyue' #定义变量 #全局变量 #数据成员刻画特征 #类变量
age = 0
def __init__(self,name,age):
#构造函数 __init__() should return None,not 'str' 只能返回None
#初始化对象的属性
self.name = name #实例变量
self.age = age
# print('student')
def do_homework(self):
print('homework')
# def print_file(self): #不需要任何参数,也要写上self #类下面的函数一定要加self,否则是要报错的
# print('name:' + self.name) #变量要通过self.操作符来引用
# print('age:' + str(self.age))
# pass #占位符
# class StudentHomework():
# homework_name = ''
# class Printer():
# student1 = Student() #类名加括号,完成实例化
# student2 = Student()
# student3 = Student()
# print(id(student1))
# print(id(student2))
# print(id(student3)) #结果表明student1,student2,student3地址不一样
# student.print_file() #调用类下面的方法,而不是类下面的函数,一会讨论
student1 = Student('石敢当',18) #实例化后,程序自动调用构造函数__init__()
student2 = Student('喜小乐',19)
student1.do_homework()
student2.do_homework()
# print(student1.name)
# print(student2.name)
# print(Student.name)
print(Student.__dict__) #字典,打印出对象里包含的所有的元素、。。可用于检查对象里的元素
# a = student1.__init__()
# print(a)
# print(type(a))
@classmethod #@装饰器, classmethod类方法
def plus_sum(cls):
pass
@staticmethod #静态方法
def add(x,y):
print('this is a static method')
student1.add(1,2) #静态方法被对象调用
Student.add(1,2) #静态方法被类调用