Day 04
面向对象的编程基础:
面向对象思想的三大要素:封装、继承、多态。
-
类和对象:
类是用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
对象是类的实例。(使用class关键字定义类)
定义类:# 标识 类名 object class class_name(object):# 或者 class class_name: def __init__(self): # __init__是一个特殊方法用于在创建对象时进行初始化操作 print('Hello') if __name__ == "__main__": lulu = class_name()# 就相当于走了初始化 __init__
eg1:
class class_name(object):# 或者 class class_name:
def __init__(self): # __init__是一个特殊方法用于在创建对象时进行初始化操作
# self代表类的事例,而非类
self.a = 100
def A(self):
print(self.a)
print('lulu')
if __name__ == "__main__":
lulu = class_name()# 就相当于走了初始化 __init__
lulu.A()# 在类中调用需要使用“.”
print(lulu.a)
运行结果:
100
lulu
100
eg2:
#打印下载进度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()
运行结果:
* 5%
** 10%
*** 15%
**** 20%
***** 25%
****** 30%
******* 35%
******** 40%
********* 45%
********** 50%
*********** 55%
************ 60%
************* 65%
************** 70%
*************** 75%
**************** 80%
***************** 85%
****************** 90%
******************* 95%
******************** 100%
- 访问可见性问题
属性和方法的访问权限只有两种(公开的和私有的)如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。
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 lulu(object):
def __init__(self):
self.__a = 100
@property
def look(self):
print(self.__a)
if __name__ == "__main__":
name = lulu()
#name.look()
name.look # 函数变成了一个属性self.look
运行结果:
100
eg2:
class lulu(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__":
baibai = lulu()
baibai._lulu__a = 10000
print(baibai._lulu__a)
运行结果:
10000
类的动态绑定
eg1:
class lulu(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__":
baibai = lulu()
baibai.a = 2000
print(baibai.a)
#类的多态绑定
baibai.b = 5000
print(baibai.b)
运行结果:
2000
5000
- 静态方法和类方法
静态方法和类方法都是通过给类发消息来调用的
eg1:
class lulu_(object):
def __init__(self):
self.__a = 100
@staticmethod
def A():
print("lalala")
if __name__ == "__main__":
baibai = lulu_()
baibai.A
#类的动态绑定
baibai.b = 5200
print(baibai.b)
运行结果:
5200
- 继承和多态
可以在已有类的基础上创建新类,做法就是让一个类从另一个类那里将属性和方法直接继承下来,从而减少重复代码的编写。
eg1:
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__":
b = B("lulu")
b.B1()
运行结果:
lulu
私有变量和私有函数不可以被继承