python_day_04

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

私有变量和私有函数不可以被继承

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值