week6_day5(面向对象高大上)

一、成员修饰符

  1、公有成员:字段名
     实例: 

class Foo:
	    def __init__(self,name,age):
		self.name=name           # 定义公有字段
		self.age=age
	    def show(self):
		print(self.name)
		print(self.age)
	obj=Foo(‘lh‘,‘18‘)
	obj.show()

  2、私有成员: __字段名
     实例:

class Foo:
    	    def __init__(self):
                self.gender = ‘man‘     # 定义公有字段
                self.__gene = 123        # 定义私有字段

        class S(Foo):
    	    def __init__(self, name):
                self.name = name
                self.__age = 123  # 私有字段只存在在本类中,任何其他类不能访问
                super(S, self).__init__()            #调用基类中的__init__方法

            def show(self):
                print(self.name)
                print(self.gender)
                print(self.__age)
                # print(self.__gene)    # 派生类不能访问基类中的私有字段

        obj = S(‘lh‘)
        obj.show()

二、特殊成员 

  1、__init__
     实例:

class Foo:
	    def __init__(self,name,age):
		self.name=name
		self.age=age
	obj=Foo(‘lh‘,‘18‘)          # 自动执行__init__方法

  2、__call__    
     实例: 

class Foo:
	    def __call__(self, *args, **kwargs):
            print(‘call‘)
	# Foo()()       # 类名()().自动执行__call__方法
	obj=Foo()
	obj()         # 对象(),自动执行__call__方法

  3、__int__      
     实例:

class Foo:
	    def __int__(self):                     # int(对象),自动执行__int__方法
                return 1
	obj=Foo()
	ret=int(obj)
	print(ret)

  4、__str__    
     实例:

class Foo:
	    def __str__(self):
		return 2
	obj=Foo()
	ret=str(obj)                             # str(对象),自动执行__str__方法
	print(ret)

  5、__getitem__ 
     实例: 

class Foo:
	    def __init__(self, name, age):
        	self.name = name
        	self.age = age

    	    def __getitem__(self, item):
            	return item

	li = Foo(‘lh‘, ‘18‘)
	ret1 = li[2]                  # 调用__getitem__方法,返回结果为2
	print(ret1)

  9、__setitem__
     实例: 

class Foo:
	    def __init__(self, name, age):
        	self.name = name
        	self.age = age
    	    def __setitem__(self, key,value):
            	print(key,value)

	li = Foo(‘lh‘, ‘18‘)
	li[2] = ‘lh‘              #调用__setitem__方法(设置key和value值)

  10、__delitem__
      实例:

class Foo:
	    def __init__(self, name, age):
        	self.name = name
        	self.age = age
	    def __delitem__(self, key):
        	print(key)

	 del li[1]                 #调用__delitem__方法

  11、__iter__
     

class Foo:
    	     def __init__(self, name, age):
                 self.name = name
         	 self.age = age

    	     def __iter__(self):
        	 return iter([11, 22, 33])

	 obj = Foo(‘lh‘, 18)
	 for i in obj:                # 调用__iter__方法,先转换成迭代器,再进行循环
    	     print(i)

  12、__dict__
      实例:

class Province:
    	     def __init__(self,name,count):
        	 self.name=name
        	 self.count=count

	 obj=Province(‘河北‘,‘10000‘)
	 print(obj.__dict__)                   # 以字典格式输出

三、metaclass,类的祖宗

  1、 Python中一切事物都是对象

  2、

class Foo:
            pass           

        obj = Foo()
        # obj是Foo类的对象
        # Foo类是type的对象

  3、 类都是type类的对象   type(..),“对象”都是以类的对象 类()

四、异常处理

  实例1:

try:
    	    r1=int(‘weq‘)     # 只要有一个错误,下边代码就不会执行
            # li=[11,22,33]
            # r2=li[444]
            # ret=int(‘111‘)
	except IndexError as e:
    	    print(‘IndexError‘)
	except ValueError as e:
            print(‘ValueError‘)
	except Exception as e:
    	    print(‘有错误‘)
	else:                         # try代码块中没错时,执行本代码
    	    print(‘正确‘)
	finally:                        # 不管从程序有没有错误,最后都会执行本代码
    	    print(‘666‘)

  实例2:

class LhError(Exception):        # 自己定义错误
    	    def __init__(self,msg):
        	self.message=msg
    	    def __str__(self):
        	return self.message
	try:
    	    raise LhError(‘错误!‘)      # 主动捕获异常
	except LhError as e:
            print(e)         # 打印错误信息

	print(123)
	assert 1==1      # 必须满足assert条件,下边代码才会执行
	print(456)

五、反射

  1、方法

# 通过字符串的形式操作对象中的成员
    class Foo:
        def __init__(self,name,age):
            self.n=name
            self.a=age
        def show(self):
            print(self.n,self.a)

    obj=Foo(‘lh‘,18)

    func=getattr(obj,‘show‘)             # 获取对象中的方法
    func()

    print(getattr(obj,‘n‘))             # 获取对象中的数据

    print(hasattr(obj,‘name‘))             # 判断对象中是否有这个数据

    setattr(obj,‘gender‘,‘男‘)            # 在对象中添加数据
    print(obj.gender)

    delattr(obj,‘gender‘)                   # 在对象中删除数据

  2、实例

# s2文件:
	def f1():
    	    return ‘首页‘

	def f2():
            return ‘新闻‘

	def f3():
    	    return ‘关注‘

# 主文件:
	import s2

	while True:
    	inp = input(‘请输入您要进入的页面:‘)
    	if hasattr(s2, inp):                       # 判断在f2中是否有输入的函数
            func = getattr(s2, inp)                # 创建输入的函数的对象
            ret = func()                        # 执行函数
            print(ret)
        elif inp == ‘q‘:
            break
        else:
            print(‘您输入错误!‘)

六、单例模式

  实例:

class Foo:
    	    __v = None

    	    @classmethod
    	    def get_instance(cls):
        	if cls.__v==None:                   # 如果cls._instance不为None,直接返回cls._instance				      
            	    return cls.__v
                else:                       # 如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
            	    cls.__v = Foo()
            	    return cls.__v

	ret = Foo.get_instance()
	    print(ret)
	ret = Foo.get_instance()
            print(ret)
	ret = Foo.get_instance()
	    print(ret)

 

时间: 2024-10-06 22:35:25

week6_day5(面向对象高大上)的相关文章

第十篇 面向对象的程序设计

第十篇 面向对象的程序设计 阅读目录 一 面向对象的程序设计的由来 二 什么是面向对象的程序设计及为什么要有它 三 类和对象 3.1 什么是对象,什么是类 3.2 类相关知识 3.3 对象相关知识 3.4 对象之间的交互 3.5 类名称空间与对象/实例名称空间 3.6 小结 四 继承与派生 4.1 什么是继承 4.2 继承与抽象(先抽象再继承) 4.3 继承与重用性 4.4 组合与重用性 4.5 接口与归一化设计 4.6 抽象类 4.7 继承实现的原理(继承顺序) 4.8 子类中调用父类方法 五

机房收费重构——关于面向对象和分层的纠结

机房收费系统的重构已经开始很久了,最近两天才感到有了一点儿头绪. 对这次重构,刚开始计划的是先做数据库,然后优化下,列出每个窗体对表的访问关系,抽出常用的访问作为存储过程,然后把访问数据库的常用方法封装成SqlHelper.这部分就是数据库的部分. 然后就是软件的结构:整体上是分了七层:三层+实体+外观+抽象工厂+D层接口.虽然计划的很好,但是在具体分层这里想了很久. 最先是对D层开始下手的.D层是什么?是对表的访问,将对数据库的读取和写入都封装成D层的类,那么,类又按照什么分呢?后来想了想以前

Lua面向对象编程

Lua中的table就是一种对象,看以下一段简单的代码: 1 local tb1 = {a = 1, b = 2} 2 local tb2 = {a = 1, b = 2} 3 local tb3 = tb1 4 5 if tb1 == tb2 then 6 print("tb1 == tb2") 7 else 8 print("tb1 ~= tb2") 9 end 10 11 tb3.a = 3 12 print(tb1.a) 上述代码会输出tb1 ~= tb2.

PHP面向对象之解释器模式

在博客园逛了1年多,从来都是看文章但没发表过什么文章.主要是因为技术太菜了,只有学习的份,自己那点水平实在也没什么好去分享的.但是最近在看 “深入PHP面向对象模式与实践” ,学习书中的内容后瞬间觉得自己有点高大上了,哈 ! 其实还是个菜B.相信也会有新手朋友在看这本(我自己也是新手),对书中我个人认为比较难的内容的学习心得就想拿出来分享和交流,1是希望对自己所学知识能够起到巩固和加深理解的作用 2是希望对看到本文且感兴趣的新手朋友一些帮助. 这部分内容看了好几遍了代码也跟着敲了几遍,估计本文想

面向对象day1

一.什么是面向对象 之前我们学习过面向过程和函数式编程,在讲函数的时候有说过之所以有函数式编程是因为面向过程编程是根据业务逻辑从上到下垒代码,会出现大量代码的重用和臃肿,so,函数式编程将同一功能的代码封装起来,方便日后调用,避免重复编写.而随着业务逻辑的需求,函数式编程一样回出现面向过程同样的问题,于是就有了面向对象编程,以实现对函数进行分类和封装,减少代码量. 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 二.创建类和对象 面向对象编程其实

面向对象多态简析

C#&C++多态问题简析 在学习C#面向对象时,对封装和继承基本上还是理解的,但是碰到多态,基本上就是记住了个父类引用指向子类对象,在很长时间内也是一直比较困惑.学习c++时,基本上算是有了一定了解.下面结合代码解释多态问题 首先是c#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Duo

Lua语言基础汇总(12)-- Lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 1 2 3 4 5 6 7 8 9 10 11 12 local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 pri

分支语句、面向对象,和心智包袱

今天想查查if...else...和switch相互嵌套怎么写,不是一般的嵌套,就是if...的大括号嵌入case分支(其中if本身在switch之外).交错起来那种.关键字把我引上了好久没来过的博客园,进入了某个技术很不错的老伙计的博客. 呃,结果我不但没找到想要的东西,又看到了if...else...或switch如何如何不好,应该进行面向对象封装和重构的文章.简而言之,就是switch的case块中含有了很多分枝的if...else...作者毫无例外地给重构为了工厂模式,先case某种情况

面向对象的软件开发

很多人在学完了python的class机制之后,遇到一个生产中的问题,还是会懵逼,这其实太正常了,因为任何程序的开发都是先设计后编程,python的class机制只不过是一种编程方式,如果你硬要拿着class去和你的问题死磕,变得更加懵逼都是分分钟的事,在以前,软件的开发相对简单,从任务的分析到编写程序,再到程序的调试,可以由一个人或一个小组去完成.但是随着软件规模的迅速增大,软件任意面临的问题十分复杂,需要考虑的因素太多,在一个软件中所产生的错误和隐藏的错误.未知的错误可能达到惊人的程度,这也