文章目录
0x01 类的初始化
初始化类__init__
称为构建方法(Constructor)。在python设置类的时候,一定要预定义def __init__(self):
函数来处理初始化的类功能,它没有回传值。建构方法的作用是在建构对象的同时,也可以初始化一些必要的信息。
class Myclass(object):
def __init__(self):
print("hello")
g = Myclass()
类的初始化预定义值,__init__(self,name):
就能把name放入。
class Myclass(object):
def __init__(self, name):
print("hello", name)
g = Myclass("aaa")
0x02 类中的函数(method)
类中的函数方法与一般函数方法类似,只需要在参数中多加一个self参数。Python类中成员函数的声明必须在第一个参数中使用self,self在调用是是不用回传的。
class Myclass(object):
def __init__(self, name):
print("hello", name)
def run1(self):
print("fun1")
def fun3(self, num1=0, num2=0):
return (num1 * 2) +num2
g = Myclass("Herbert")
g.run1()
print(g.fun3(1, 2))
print(g.fun3(num1=1, num2=2))
运行结果:
0x03 类中的属性(property)
属性是对象的静态描述,因为Python的属性默认都是公开的,所以都可以取得。在使用是需要通过self才会取得该类中的属性。
class myclass(object): # 继承python最上层的object类
mX = 1 # 预定义变量
def __init__(self, x): # 类初始化函数
self.mX = x
def fun1(self): # 类中的公开函数
for x in range(1, self.mX, 1):
for y in range(1, x+1, 1):
s = str(x) + "*" + str(y) + "=" + str(x * y)
print(s, end='\t')
print()
g = myclass(10) # 调用和引导类,并初始化数据
g.fun1() # 运行类中的公开函数fun1
0x04 类中调用其他的函数方法
来类中调用其他的函数方法是通过self来完成的。在fun1中调用fun2,如下所示:
class myclass(object): # 继承python最上层的object类
mX = 1 # 预定义变量
def __init__(self, x): # 类初始化函数
self.mX = x
def fun1(self): # 类中的公开函数fun1
for x in range(1, self.mX, 1):
for y in range(1, x+1, 1):
self.fun2(x, y) # 调用同类中的函数
print()
def fun2(self, x, y): # 类中的公开函数fun2
s = str(x) + "*" + str(y) + "=" + str(x * y)
print(s, end='\t')
g = myclass(10) # 调用和引导类,并初始化数据
g.fun1() # 运行类中的公开函数fun1
运行结果
0x05 设置公开、私有的类函数方法
在Python的类中所有的函数方法和属性都是公开的。如果要设置为私有,只需命名时在类函数名称前面添加两个下划线(__)
即可
class myclass(object):
mypub = 1 # 公开属性
__mypub = 2 # 私有属性
def __init__(self, x, y):
self.mypub = x
self.__mypub = y
def funpub(self): # 公开函数
print("fun1")
def __funpub(self): # 私有函数
print("fun2")
g = myclass(6, 6)
print(g.mypub)
# print(g.__mypub) # 不能调用私有属性
g.mypub()
# g.__mypub() # 不能调用私有函数方法
结果:
调用会报错,没有该属性。所以私有函数、属性是不能调用的。
0x06 把类独立成另一个文件
为了维护程序的便利性,会推荐把类独立成另一个文件,以后使用时只要通过import调用该类即可。类的文件名称推荐与类名称相同。
myclass.py
class myclass(object): # 继承python最上层的object类
mX = 1 # 预定义变量
def __init__(self, x): # 类初始化函数
self.mX = x
def fun1(self): # 类中的公开函数
for x in range(1, self.mX, 1):
for y in range(1, x+1, 1):
s = str(x) + "*" + str(y) + "=" + str(x * y)
print(s, end='\t')
print()
然后调用myclass.py 中的fun1函数
from myclass import myclass
g = myclass(10)
g.fun1()
结果:
0x07 继承——OOP面向对象
面向对象编程——Object Oriented Programming
一、继承
代码实例,定义一个类myclasschild
继承自父类myclass
,然后在子类中调用父类函数。
class myclass(object): # 父类
def __init__(self, name):
print("mycalss", str(name))
def fun1(self):
print("myclass->fun1")
class myclasschild(myclass): # 子类,继承myclass类
def __init__(self, name):
print("myclasschild", str(name))
def fun2(self):
print("myclasschild->fun2")
g = myclasschild("Herbert555") # 调用子类
g.fun1() # 因为继承的关系拥有fun1
g.fun2() # 调用子类函数
结果
二、多重继承
Python也可以有多重继承,可同时拥有两个或两个以上的父类。
示例:子类同时继承两个父类
class myclass(object): # 父类1
def fun1(self):
print("myclass->fun1")
class myclass2(object): # 父类2
def fun2(self):
print("myclass2->fun2")
class myclasschild(myclass, myclass2): # 子类,同时继承两个类
def __init__(self, name):
print("myclasschild", str(name))
def fun3(self):
print("myclasschild->fun2")
g = myclasschild("Herbert555") # 调用子类
g.fun1() # 因为继承的关系拥有fun1
g.fun2() # 因为继承的关系拥有fun2
g.fun3() # 调用子类函数
运行结果:
三、调用父类函数
python提供调用父类函数super
,但在python2和python3中不一样,方法如下:
- super().fun2() # python3的调用父类函数方法。
- super(myclasschild,self).fun2 # python2的调用父类函数方法。
在程序中在子类函数fun2中调用父类:
class myclass(object): # 父类
def fun1(self):
print("myclass->fun1")
def fun2(self):
print("myclass->fun2")
class myclasschild(myclass): # 子类
def __init__(self, name):
print("myclasschild", str(name))
def fun2(self):
try:
super().fun2() # python3调用父类函数方法
except:
super(myclass, self).fun2() # python2调用父类函数方法
print("myclasschild->fun2")
g = myclasschild("Herbert555") # 调用子类
g.fun1() # 因为继承的关系拥有fun1
g.fun2() # 调用子类函数
运行结果:
四、调用父类属性
同样也可以用super()
来调用父属性,如super(myclasschild,self).value3
class myclass(object): # 父类
value1 = 1
value2 = 2
value3 = 3
class myclasschild(myclass): # 子类
value3 = 13
def fun1(self):
print(self.value1) # 输出 1 继承父类属性
print(self.value2) # 输出 2 继承父类属性
print(self.value3) # 输出 13 本身类的属性
print(super(myclasschild, self).value3) # 输出 3 父类的属性
g = myclasschild() # 调用子类
g.fun1()
运行结果: