面向对象的编程思想和Python的类,类的方法和属性,实例方法这一文从面相对象的角度,介绍类的定义,类的属性和自定义方法。
本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和Python类的继承。
一、访问权限:
Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问的。例如:
from selenium import webdriver
import time
class Commonshare:
url = 'https://mail.126.com/'
def __init__(self):#初始化浏览器
self.driver=webdriver.Chrome()
self.driver.maximize_window()
if __name__ == '__main__':
com = Commonshare()
com.driver.get(com.url)
url就是在类中定义的属性,在类的外部通过com的对象可以直接进行使用。因此Python中没有对属性和方法设置访问权限。为了保证类内部的某些属性不被外部访问,可以进行如下的访问限制:
1.__open__ :收尾双下划线表示定义特殊方法,一般是系统定义的方法
2._open: 在开头加单下划线表示保护类型的成员,仅允许类本身和子类进行访问。
from selenium import webdriver
import time
class Commonshare:
_url = 'https://mail.126.com/'
def __init__(self):#初始化浏览器
self.driver=webdriver.Chrome()
self.driver.maximize_window()
if __name__ == '__main__':
com = Commonshare()
com.driver.get(com._url)
从以上的运行结果可以得出:保护属性可以通过实例名访问
3.__foo:双下划线表示(私有)类型的成员,只允许定义该方法的类本身进行访问,不能通过类的实例进行访问
from selenium import webdriver
class Commonshare:
__url = 'https://mail.126.com/'
def __init__(self):#初始化浏览器
self.driver=webdriver.Chrome()
self.driver.maximize_window()
print('类内部的',Commonshare._url)
if __name__ == '__main__':
com = Commonshare()
com.driver.get(com._Commonshare__url)#可以访问
com.driver.get(com.__url)#不能访问
从以上的结果可以看出:私有属性可以通过“类名.属性名”的方式访问,也可以通过"实例名.类名__url"访问。不能直接通过“实例名.属性名”访问
上文中介绍实例属性,实例属性在方法体外,是无法访问的,但是我们又想访问怎么办呢?
二、属性
(一)Python中,可通过@property(装饰器)将一个方法转为属性。转换后,可通过方法名来访问,不需要再加()访问。
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
@property#将方法转换为属性
def num_avg(self): #计算机求平均数的方法
return (self.num3+self.num2+self.num1)/3 #返回平均成绩
avg=Avg_Score(60,50,90)#创建类的实例
print('三科成绩之和为:',avg.num_avg)#类的实例,调用属性,得到属性值
不将方法转换成属性,如下,调用方法
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
def num_avg(self): #计算机求平均数的方法
return (self.num3+self.num2+self.num1)/3 #返回平均成绩
avg=Avg_Score(60,50,90)#创建类的实例
print('三科成绩之和为:',avg.num_avg())#调用实例方法,得到平均值
(二)在Python中,类的属性或者实例,是可以在类体外修改的。@property将一个方法转为属性为只读属性,不能更改。如图
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
@property#将方法转换为属性
def num_avg(self): #计算机求平均数的方法
return (self.num3+self.num2+self.num1)/3 #返回平均成绩
avg=Avg_Score(60,50,90)#创建类的实例
print('三科成绩之和为:',avg.num_avg)#类的实例,调用属性,得到属性值
avg.num1=3
print(avg.num_avg)
avg.num_avg='55'#不能更改,出错
print(avg.num_avg)
三、继承
继承是面向对象编程思想的重要特征之一,继承可以实现代码的重用,同时还可以进行类之间关系的梳理。
(一)继承的语法
class 类名(父类的类名)
(二)子类调用父类的方法实现如下:
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
# @property#将方法转换为属性
def num_avg(self): #计算机求平均数的方法
return (self.num3+self.num2+self.num1)/3 #返回平均成绩
class Student_Sort(Avg_Score):#Student_Sort类继承了Avg_Score类,,
pass
if __name__ == '__main__':
stu=Student_Sort(99,100,80)
print(stu.num_avg())# Student_Sort可以直接调用Avg_Score类的方法
(三)子类可以重写父类的方法
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
# @property#将方法转换为属性
def num_avg(self): #计算机求平均数的方法
print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩
class Student_Sort(Avg_Score):
def num_avg(self):#重写父类的方法
print(self.num1+self.num2)
if __name__ == '__main__':
stu=Student_Sort(99,100,80)
stu.num_avg()#仅打印子类方法的结果
注意重写的方法,调用该方法时不会再进行父类方法的调用和结果显示
四、子类调用父类的__init__()方法
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
# @property#将方法转换为属性
def num_avg(self): #计算机求平均数的方法
print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩
class Student_Sort(Avg_Score):
def __init__(self):
print("结果")
# def num_avg(self):#重写父类的方法
# print(self.num1+self.num2)
if __name__ == '__main__':
stu=Student_Sort()
stu.num_avg()
当我们定义的属性在__init__()方法中时,子类同时改写了__init__()时,那么父类定义的方法中的属性就会找不到,出现程序错误。
(二)不重写__init__()方法,子类中的方法是可以直接使用父类的属性,例如:
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
# @property#将方法转换为属性
def num_avg(self): #计算机求平均数的方法
print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩
class Student_Sort(Avg_Score):
def sum(self):
print(self.num1+self.num2)#可以使用父类的属性。
if __name__ == '__main__':
stu=Student_Sort(78,89,58)
stu.num_avg()
(三)通过super()函数调用父类中的__init()方法
class Avg_Score():# 平均成绩类
def __init__(self,num1,num2,num3):
self.num1=num1 #英语成绩
self.num2=num2 #语文成绩
self.num3=num3 #数学成绩
def num_avg(self): #计算机求平均数的方法
print((self.num3+self.num2+self.num1)/3 ) #返回平均成绩
class Student_Sort(Avg_Score):
def __init__(self):
print("结果")
super().__init__(58,58,59)#调用父类的__init__()方法
if __name__ == '__main__':
stu=Student_Sort()
stu.num_avg()