Q:类
A:
what
类是将数据以及这些数据上的操作封装在一起
关键字:class
格式
class 类名称(): #类变量的定义
变量1=...
变量2=...
'''
构造函数:__init__函数,实例化时自动调用
构造函数不能return 字符串
构造函数的作用是让类实例化时可以传入数据
初始化对象的属性,类的特征
'''
#def前有空行
def __init__(self,变量1,变量2):
self.变量1=变量1
self.变量2=变量2
print(类名.类变量) #内部访问类变量的方法1,与外部相同
print(self.__class__.类变量) #内部访问类变量的方法2
'''
类方法
在类方法中操作类变量,@classmethod是一个装饰器
不能在实例化时自动调用
cls可以随意改,但python建议使用cls
'''
#def前有空行
@classmethod
def 函数1(cls): #类方法中访问类变量的方法
cls.类变量 += 1
'''
实例方法是普通函数,定义的是实例变量,和类变量无关
在类内部的函数必须要在参数区域加入self(也可以使用this但python推荐使用this)
'''
#def前有空行
def 函数2(self): #在类内部的函数调用类内部的参数时要加self.
print(self.变量1)
'''
静态方法,@staticmethod是一个装饰器
静态方法也可以调用类变量,不可以调用实例变量
不推荐使用
'''
#def前有空行
@staticmethod
def 函数3(x,y): #静态方法不需要加self.
print(类名.类变量)
how
实例化:
变量3=类名(变量4,变量5)
变量3.函数2()
在一另一个模块实例化:
from 模块1(类所在模块即文件名) import 类名
变量3=类名(变量4,变量5)
变量3.函数2()
类变量可以通过(类名.变量名)访问
类会自动出现__dict__的变量,是一个字典,当实例化一个类后,字典会自动填充数值
调用方法:
变量3=类名(变量4, 变量5)
print(变量名.__dict__)
得到{变量1:变量4, 变量2:变量5}
调用类方法、静态方法、实例方法,方法一致
但类方法尽量不使用
#构造函数:实例调用
类名.函数1()
实例名.函数1()
方法的内部调用
self.方法名()
通过方法进行实例化:有办法验证实例化输入值的正确性
class 类名称():
'''
类变量的定义
初始化对象的属性,类的特征,不可见变量不被传入
'''
#def前有空行
def __init__(self,变量1,变量2):
self.变量1 = 变量1
self.变量2 = 变量2
self.不可见1 = 0 #不可见变量初始化
def 函数1(self,不可见1): #实例方法 def前有空行
print(self.不可见1)
实例化:
变量3 = 类名(变量4,变量5)
变量3.函数1()
how much
类只负责封装不负责执行,不要在类中尝试调用
编程建议:
不建议类名称使用下划线,建议使用大写第一个字母连接命名类
应该在一个模块中写类,另一个模块调用它,尽量一个模块只写一个类
不建议使用静态方法
不建议直接使用外部实例化定义,建议都通过方法
举例1:类的定义、实例方法、实例调用
class Student():
name = ''
age = 0
def print_file(self):
print('name' + self.name)
print('age'+str(self.age))
student = Student()
student.print_file()
输出
name:
age:0
举例2:实例化不同结果
class Student():例3:类变量的使用
class Student():
StudentSum = 0
name = ''
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
self.__class__.StudentSum += 1
def Homework(self):
print(self.name, self.age)
stu1 = Student('小a', 18)
stu2 = Student('小b', 19)
stu3 = Student('小c', 20)
stu4 = Student('小d', 21)
print(Student.StudentSum)
输出
4
举例3:类方法的使用
class Student():
StudentSum = 0
name = ''
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
def Homework(self):
print(self.name, self.age)
sut1 = Student('小明', 18)
print(sut1.age)
print(Student.StudentSum)
sut1.Homework()
输出
18
0
小明 18
举例4:在类方法中操作类变量
class Student():
StudentSum = 0
name = ''
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def plus_sum(cls):
cls.StudentSum += 1
def Homework(self):
print(self.name, self.age)
stu1 = Student('小a', 18)
stu1.plus_sum()
stu2 = Student('小b', 19)
Student.plus_sum()
stu3 = Student('小c', 20)
stu4 = Student('小d', 21)
print(Student.StudentSum)
输出
2
举例5:实例变量的不可见性
class Student():
def __init__(self, name, age):
self.name = name
self.age = age
self.__h = 0
def Homework(self, h):
self.__h = h
print(self.__h)
stu1 = Student('小a', 18)
stu1.Homework(59)
输出
59
Q:对象的不可见性
A:
what 类中的函数或方法进行私有化
why 对方法和函数进行安全性保护
when 当不想从外部调用对象时使用
how
表示私有的方法是:在变量或方法前加__函数名;__变量名
在实例化时,可以通过公开的方法,内置的命令,访问到私有变量,但不可以从外部直接访问
在实例化时,不可以访问私有方法。
how much
没有关键字public private
在类实例字典中私有变量会显示成_类名__变量名
构造函数的__init__,凡是前后都有双下划线的,系统不认为私有
不可以从外部动态的建立私有变量
其实从外部可以访问私有变量,用_类名__变量名,但不推荐
Q:继承性
A:
what
why 继承性的作用是避免定义重复的方法和变量
how
类1继承了类2的特征,类1是类2是子类,类2是类1的父类
模块1:
from 模块2 import 类2
#class前需要两排空行
class 类1(类2):
def __init__(self, 子变量1, 父变量1, 父变量2): #def前有空行
self.子变量1 = 子变量1
父类名.__init__(self, 父变量1, 父变量2) #将数据传入父类中,需要加self
super(子类名, self).__init__(父变量1, 父变量2) #另一种方法,应优先考虑
def 函数1(self): #方法 def前有空行
super(子类名, self).函数2() #若子类父类方法重名,则加入super优先调用父类方法
print('语句')
模块2:
class 类2():
#def前有空行
def __init__(self, 父变量1, 父变量2):
self.父变量1 = 父变量1
self.父变量2 = 父变量2
#方法
#def前有空行
def 函数2(self):
print('语句')
实例化:
实例1.类1 = 类1(子变量1, 父变量1, 父变量2)
实例1.函数1()
实例1.函数2()
how much
子类可以完全继承父类的方法,变量,以及构造函数需要的赋值
允许多继承,一个子类可以继承多个父类
子类方法和父类方法同名的话,优先调用子类方法
举例6:类的继承
模块1:
from c2 import Human
class Student(Human):
def __init__(self, school, name, age):
self.school = school
Human.__init__(self, name, age)
#另一种方法
super(Student, self).__init__(name, age)
def Homework(self):
print(self.school)
stu1 = Student('港大', '小a', 18)
stu1.PrintName()
模块C2:
class Human():
HumanSum = 0
def __init__(self, name, age):
self.name = name
self.age = age
def PrintName(self):
print(self.name)
输出:
小a