面向对象编程
一、基础
- 面向对象思想三大要素:封装、继承、多态。
- 类和对象:类是对象的蓝图和模板,而对象是类的实例。类是抽象的概念,而对象是具体的东西。在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。
- 定义类:
class Class_name(object):
def __init__(self):
self.a = 1000
def A(self):
print(self.a)
print('ynn nyy yny')
if __name__ == "__main__":
ynn = class_name() #就相当于走了初始化__init__
ynn.A() #在类中调用需要使用‘.’
print(ynn.a)
运行结果:1000
ynn nyy yny
1000
#打印下载进度100%
import time
class jindu(object):
def __init__(self):
self.a = 1
def A(self):
for i in range(0,100):
time.sleep(0.5)
if i % 5 == 0:
res = "*"*self.a
print('%s %d%%'%(res,(i+5)))
self.a += 1
if __name__ == "__main__":
ningning = jindu()
ningning.A()
运行结果:
1. 5%
** 10%
*** 15%
**** 20%
***** 25%
****** 30%
******* 35%
******** 40%
********* 45%
********** 50%
*********** 55%
************ 60%
************* 65%
************** 70%
*************** 75%
**************** 80%
***************** 85%
****************** 90%
******************* 95%
******************** 100%
#判断文件中大写字母的个数
class title(object):
def __init__(self,path):
self.path = path
self.count = 0
def wenjian(self):
with open(self.path,'r',encoding = 'utf8') as f:
res = f.readlines()
for da in res:
for i in da:
if i.isupper():
self.count += 1
print("文件中大写字母有{}个".format(self.count))
if __name__ == "__main__":
path = 'C:/Users/Asus/Desktop/tt.txt'
dee = title(path)
dee.wenjian()
运行结果:文件中大写字母有10个
- 访问可见性问题:属性和方法的访问权限只有两种(公开的和私有的)如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。
eg1:
class class_name:
def __init__(self):
self._a = 100
def A(self):
print(self._a)
print(self.B())
def _B(self):
print('Hello B')
if __name__ == "__main__":
name = class_name()
#name.A()
#print(name.__a)# 私有变量不可外部调用
#print(name.__B())
print(name._a)
运行结果:
100
说明:私有变量和私有函数都不可外部调用
二、进阶
- @property装饰器
之前将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问。
如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便。
eg1:
class lala(object):
def __init__(self):
self.__a = 100
@property
def look(self):
print(self.__a)
if __name__ == "__main__":
name = lala()
#name.look()
name.look # 函数变成了一个属性self.look
运行结果:
100
eg2:
class lala(object):
def __init__(self):
self.__a = 100
@property
def a(self):
return self.__a
@a.setter#修改器的名字需要和访问器的名字一样
def a(self,new_num):
self.__a = new_num
if __name__ == "__main__":
ynn = lala()
ynn._lala__a = 10000
print(ynn._lala__a)
运行结果:
10000
- 类的动态绑定
eg1:
class lala(object):
def __init__(self):
self.__a = 100
@property
def a(self):
return self.__a
@a.setter
def a(self,new_num):
self.__a = new_num
if __name__ == "__main__":
ynn = lala()
ynn.a = 2000
print(ynn.a)
#类的动态绑定
ynn.b = 5000
print(ynn.b)
运行结果:
2000
5000
- 静态方法和类方法都是通过给类发消息来调用的
eg1:
class lala_(object):
def __init__(self):
self.__a = 100
@staticmethod
def A():
print("lalala")
if __name__ == "__main__":
ynn = lala_()
ynn.A
ynn.b = 5200
print(ynn.b)
运行结果:
5200
- 继承和多态:可以在已有类的基础上创建新类,做法就是让一个类从另一个类那里将属性和方法直接继承下来,从而减少重复代码的编写。
class A(object):
def __init__(self,a1):
self.a = 100
self.a1 = a1
def A1(self):
print("A1")
class B(A):
def __init__(self,a1):
A.__init__(self,a1)
pass
def B1(self):
print(self.a1)
if __name__ == "__main__":
ynn = B("lala")
ynn.B1()
运行结果:
lala
说明:私有变量和私有函数不可以被继承