python面向对象整理(2)


一.成员修饰符

共有成员:
私有成员:字典(字段或方法)前面有两个下划线__.就表示为私有的
只有类内部函数才能访问,不能直接访问.即只能通过该类的方法访问该类的私有成员
子类也不能访问父类的私有字段,只能通过父类的方法访问

#################################################################

class Foo:
__country = "China"

def __init__(self,name,age):
self.name = name
self.__age = age
def showAge(self):
return self.__age
def showCountry(self):
return Foo.__country

@staticmethod
def staticShowCountry():
return Foo.__country

foo = Foo("xiaoming",23)
print(foo.name)

foo_age = foo.showAge()
print(foo_age)

foo_country = foo.staticShowCountry()
print(foo_country)

################################################################

二.特殊方法

1.__call__ : 对象名() 就相当于执行类中的__call__方法

################################################################
class Foo:
def __init__(self):
print("This is init method")
def __call__(self, *args, **kwargs):
print("This is call method")

foo = Foo() #执行的是__init__方法
foo() #执行的就是__call__方法
################################################################

2.__int__:执行int(对象)相当与执行对象的__init__方法,并把返回值给对象(很少使用)

__str__:执行str(对象) 相当于执行对象的__str__方法,并把返回值给对象
使用最多的场景就是相当于java中的 toString() 方法
print的时候会执行类的__str__方法,并返回返回值

__del__:析构方法,对象销毁的时候调用该方法。python

__dict__ :讲对象中封装的所有内容通过字典的形式返回

__getitem__ :切片(slice类型)或者索引
__setitem__
__delitem__

__iter__: 如果类中有__iter__方法,那么对象就是可迭代对象
对象.__iter__()的返回值是一个迭代器
for 循环遇到迭代器,就执行next()方法


三. metaclass,类的祖宗

1.在python中一切事物都是对象
2. class Foo:
pass
obj = Foo()
#obj是对象,Foo类
#Foo类也是一个对象,type的对象

#class类默认继承object类
Foo = type("Foo",(object,),{'func':"function()"})
3.类都是type的对象
"对象"都是以类的对象 类()

###############################################################################################
class MyType(type):

def __init__(self,*args,**kwargs):
super(MyType,self).__init__(*args,**kwargs)

def __call__(self, *args, **kwargs):
obj = self.__new__(self,*args,**kwargs)
self.__init__(obj)

class Foo(object,__metaclass__=MyType): #这是python3.6的写法

# __metaclass__ = MyType #这是python2.7 的写法
def __init__(self,name):
self.name = name
def __new__(cls, *args, **kwargs):
return object.__new__(cls,*args,**kwargs)

obj = Foo()
#obj = Foo()执行流程详解
#第一步:python解释器识别Foo类,调用父类MyType的__init__方法,其中self是Foo类
#第二部:Foo() ,调用父类MyType的__call__方法,其中self是Foo类
# MyType的__call__方法调用 Foo类的__new__方法,obj接受Foo类__new__方法返回的对象
#第三部:执行MyTpye的 self.__init__方法,self是Foo类,即调用Foo的__init__方法,完成构造Foo类的对象 obj

##################################################################################################

四.异常处理


1.标准的异常写法
#################################################################################
try:
int("bAR")
print("可能出问题的代码快")
except IndexError as e: #IndexError是Exception的子类,为了日志分析,判断莫一类的错误
print("IndexError",e)
except ValueError as e:
print("ValueError",e)
except Exception as e : #异常的超类
print(e)

else:
print("没有报错信息才会执行的代码块")
pass
finally:
print("在判断是否有异常之后,一定会执行的代码快")
################################################################################

2.主动触发异常: raise Exception("错误的内容")

###########################################
def db():
return False

def index():
try:
result = db()
if not result:
raise Exception("数据库处理错误") #主动触发错误的语法
except Exception as e:
str_error = str(e)
print(str_error)

index()
#############################################

3.自定义异常
############################################
class OldboyError:

def __init__(self,message):
self.message = message
def __str__(self):
return self.message


try:
raise OldboyError("调用自定义的OldboyError异常")

except OldboyError as e:
print(e)
##################################################

4.断言: 语法格式:assert 判断条件

目的:由于强制用户符合一定的条件,可以捕获,但是一般不捕获

#################################################
assert 1==1
print('assert强制用户满足1==1的条件')

assert 1==2
print("assert强制用户满足1==2的条件")

#################################################


五.反射

1: 通过字符串的形式操作对象中的成员

1.getattr(object,"属性值/方法名") :从object对象中获取 属性值或者方法
2.hasattr(object,"属性值/方法名") :判断object对象 是否有 指定的属性值或者方法
3.setattr(object,"属性值/方法名","value设定的值") :设定object的 属性值为 value
4.delattr(object,"属性值") :删除对象中的属性值

###############################################
class Foo:

def __init__(self,name,age):
self.name = name
self.age = age
def show(self):
print("%s-%s" % (self.name,self.age))

foo = Foo("xiaoming",12)

name = getattr(foo,"name")
print(name)

print(hasattr(foo,"age"))

setattr(foo,"gendar","nan")
print(hasattr(foo,"gendar"))

#############################################

2.小实例

##########################################
s2.py
__________________________________________
def f1():
return "首页"

def f2():
return "新闻"

def f3():
return "精华"

#########################################

s1.py
_________________________________________

import s2

while True:
inp = input("请输入一个值:")

if hasattr(s2,inp):
func = getattr(s2,inp)
result = func()
print(result)
else:
print("获取失败")

#######################################

六.设计模式

1.单例模式:调用修改的都是一个实例对象

######################################
class Foo:

__v = None

@classmethod
def get_instance(cls):
if cls.__v:
return cls.__v
else:
cls.__v = Foo()
return cls.__v


obj1 = Foo.get_instance()
print(obj1)

obj2 = Foo.get_instance()
print(obj2)

obj3 = Foo.get_instance()
print(obj3)
#####################################

原文地址:https://www.cnblogs.com/aniuzaixian/p/8043794.html