一.成员修饰符
共有成员:
私有成员:字典(字段或方法)前面有两个下划线__.就表示为私有的
只有类内部函数才能访问,不能直接访问.即只能通过该类的方法访问该类的私有成员
子类也不能访问父类的私有字段,只能通过父类的方法访问
#################################################################
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)
#####################################