Python:Day25 成员修饰符、特殊成员、反射、单例
一、成员修饰符
共有成员
私有成员,__字段名,__方法
- 无法直接访问,只能间接访问
class Foo:
def __init__(self,name,age):
self.name = name
self.__age = age #字段名前加双下划线就成私有成员了,外部无法直接访问 def show(self): #如果想访问的话需要定义一个公有成员,然后返回私有私有字段。
return self.__age obj = Foo('alex',18)
print(obj.name)
print(obj.__age) #外部无法直接访问,AttributeError: 'Foo' object has no attribute '__age'
print(obj.show()) #通过定义的公有方法,可以间接访问
公有字段私有化
class Foo:
__v = '' #静态字段
def __init__(self):
pass def show(self):
return Foo.__v #前面必须要加Foo print(Foo.__v) #静态字段私有之后也是无法通过外部访问的
obj = Foo()
print(obj.show())
继承中的私有字段:
class F():
def __init__(self):
self.ge = ''
self.__gene = '' class S(F):
def __init__(self,name):
self.name = name
self.__age = 18
super(S,self).__init__() #想要使用父亲字段,必须要执行父类Init def show(self):
print(self.name)
print(self.__age)
print(self.ge) #必须要在init中同时执行父类,不然此代码报错:AttributeError: 'S' object has no attribute 'ge'
print(self.__gene) #继承的时候父亲中的私有字段不继承,如果想访问,要在父类中写一个公有方法间接访问 obj = S('alex')
obj.show() #AttributeError: 'S' object has no attribute '_S__gene'
二、特殊成员
__init__ 类()自动执行
__call__ 对象() 类()()自动执行
class foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):
print('aaa')
foo()() #对象加括号自动执行__call__方法
__int__ int(对象)
class foo:
def __init__(self):
pass def __int__(self):
print('')
return 2222 obj = foo()
print(obj,type(obj)) #<__main__.foo object at 0x000000000065E3C8> <class '__main__.foo'>
r = int(obj) #int一个对象,自动执行对象中的__int__方法,并将返回值赋值给int对象
print(r) #
__str__ str(对象)
class foo:
def __init__(self):
pass def __str__(self):
return 'alex' obj = foo()
print(obj,type(obj)) #数据类型为<class '__main__.foo'>
i = str(obj) #str一个对象,自动执行对象中的__str__方法
print(i) #alex
class foo:
def __init__(self,n,a): #TypeError: object() takes no parameters,如果出现这个错误,一般是init写成了int
self.name = n
self.age = a def __str__(self):
return '%s - %s'%(self.name,self.age) obj = foo('alex',18)
print(obj) #print(str(obj)) str(obj)运行对象中的__str__方法,并获取其返回值
__add__
__del__
class foo:
def __init__(self,n,a):
self.name = n
self.age = a def __add__(self, other): #self = obj1,other = obj2
return 'xxxoooo' def __del__(self):
print('析构方法') #对象被销毁时,自动执行 obj1 = foo('alex',18)
obj2 = foo('eric',66)
r = obj1 + obj2 #两个对象相加时,自动执行第一个对象的__add__方法,并且将第二个对象当做参数传入
print(r,type(r))
__dict__ #将对象中封装的所有内容以字典的形式返回
class foo:
def __init__(self,n,a):
self.name = n
self.age = a
self.gender = 'male' obj = foo('alex',18)
d = obj.__dict__
print(d) #{'gender': 'male', 'name': 'alex', 'age': 18} ret = foo.__dict__ #不仅可以返回对象的,也可以返回类中的成员,包括类的注释
print(ret)
__getitem__ #切片(sliceo类型)或者索引
__setitem__
__delitem__
class foo:
def __init__(self,name,age):
self.name = name
self.age = age def __getitem__(self, item):
return item+10 #因为这是获取数值,所以有返回值,下面两个没必要有返回值,因为也没地方接收了 def __setitem__(self, key, value): #key其实就是索引
print(key,value) def __delitem__(self, key):
print(key) li = foo('alex',18)
r = li[8] #自动执行li对象的类中的__getitem__方法,8当作参数传递给item
print(r) li[100] = "asdjk" #这种对象带[]的形式,将自动执行__setitem__方法,key为中括号中值,value为等号后面值
# 这个方法没必要有返回值,因为这已经是个等式了,有返回值也没地接收了 del li[999] #这种形式和类中的__delitem__这个方法是对应的,执行此命令,将执行__delitem__方法 #只要前面几个的语法这样写,就对应执行上面的函数,也只是对应关系,具体执行什么操作和表面意思一点关系都没有
__iter__
class Foo:
def __iter__(self):
return iter([11,22,33])
obj = Foo()
for i in obj:
print(i)
# 如果对象中有__iter__方法,那么该对象就是可迭代对象。
# 可迭代对象.__iter__返回的是一个迭代器。
# for循环的时候,如果循环的对象是可迭代对象,那么先执行对象的__iter__,然后针对return的迭代器进行迭代。
# 如果循环的对象是迭代器,那么就直接进行迭代。
# 迭代的本质其实就是执行迭代器的next方法
metaclass元类
在python中一切皆对象,对象是对象,类也是对象,类是type的对象。
class Foo:
def func(self):
print(123)
# =============================================================================
def func(self):
print("hello world!") Foo = type("QQQ",(object,),{"func":func}) #声明一个类,类中有一个成员func,成员信息可以用__dict__查看 # 上面两种写法是一样的
obj = Foo()
print(Foo.__dict__)
obj.func()

异常处理
try:
# 代码块,逻辑
inp = input("请输入:")
i = int(inp)
except Exception as e:
# e是Exception的对象,对象中封装了错误信息
# 上述代码块出错,自动执行当前代码块的内容
print(e)
i = 1
Exception是大BOSS,包含所有异常,如果想捕捉某一类型的异常可以用具体异常类型。
try:
int("22w")
except IndexError as e:
print(e)
except ValueError as e:
print("value_error:",e)
except Exception as e:
print("Exception",e)
else:
print("没错的时候执行这块,有错时不执行")
finally:
print("无论是否错误都执行")
反射:
- getattr
-setattr
-hasattr
-delattr
通过字符串的形式操作对象中的成员
class foo:
def __init__(self,name,age):
self.name = name
self.age = age def show(self):
print('this is the test') obj = foo('alex',18) r = getattr(obj,'name') #有返回值,返回值为对应字段的值
print(r) #alex
r1 = getattr(obj,'show') #引种形式获取成员,括号后面的参数必须是字符串
r1() #执行show方法,得到结果:this is the test,说明getattr不仅可以获得字段,也可以获得方法。 setattr(obj,'score',88) #没有返回值,返回值为None
print(obj.score) # r2 = hasattr(obj,'gender') #有返回值,返回值为布尔值
print(r2) #False delattr(obj,'score')
print(obj.score) #AttributeError: 'foo' object has no attribute 'score'
#类也是对象,所以也可以对类使用上述函数
class foo:
country = 'china' def show(self):
print('this is the test') r = getattr(foo,'country') #同样可以获得里面的字段,因为类是type的对象,从这块可以看出,其实country和self.name一样,都是封装在对象里的内容
print(r) #china r1= hasattr(foo,'show') #
print(r1) #True
#为什么是ture?由此可以看出getattr获取的是包含在对象内部的内容。
# 那为什么之前对象可以获得类中的内容?因为对象中有类对象指针,所以类中的成员也是对象中的一部分
#在python中一切皆对象,所以模块也是对象,对模块也可以操作
import model1 r1 = getattr(model1,'s')
print(r1)
setattr(model1,'tel',88888) #虽然设置了,可以获取到值,但这些现在只是存在内存中,并未存在文件中
print(getattr(model1,'tel')) r2 = getattr(model1,'func') #获取模块中的函数
r2() r3 = getattr(model1,'cls') #获取模块中的类
obj = r3('alex',18) #创建对象
print(obj.name) #获取类中的name字段
反射小练习:仿WEB业面点击获得相应信息
class foo:
def f1(self):
return '首页'
def f2(self):
return '新闻'
def f3(self):
return '精华' inp = input('please input your URL>>>:')
obj = foo()
#因为方法中需要有self,所以要创建对象,如果不想创建对象,有两种方法,一是用静态方法,这样就不用传self了,另外一个是引入模块,在定义函数,这样也不用传参数
if hasattr(obj,inp):
func = getattr(obj,inp) #这里用Foo也可以取到方法,但是执行的时候需要self,解决方法如上
result = func()
print(result)
else:
print('')
单例模式:
单例,使用同一个实例(对象)
class foo:
__v = None #这个字段是静态字段,而且是私有字段
@classmethod #此处为类方法,这样的话,下面的方法的cls就不用传参了,python会自动传,此处也可以用静态方法,这样下面的参数就需要自己传了
def get_instance(cls): #此处的cls为类
if cls.__v:
return cls.__v
else:
cls.__v = foo() #给__v赋值,前面必须要加cls,就像给self.name赋值一样
return cls.__v #return的值也要是cls.__v obj = foo.get_instance() #因为上面用的是类方法,所以这块不用传入参数类,如果为静态方法,那么此处括号内要加foo才行
obj1 = foo.get_instance()
obj2 = foo.get_instance() print(obj) #<__main__.foo object at 0x00000000009B70B8>
print(obj1) #<__main__.foo object at 0x00000000009B70B8>
print(obj2) #<__main__.foo object at 0x00000000009B70B8>
第二次写单例:
class Foo:
__v = None @classmethod # 这块用类方法好一些,因为在方法里面用到类了,用静态方法也行,只不过就要写成Foo.__v
def get_instance(cls):
if not cls.__v:
cls.__v = Foo()
return cls.__v obj1 = Foo.get_instance()
print(obj1) # <__main__.Foo object at 0x0000000000426C18>
obj2 = Foo.get_instance()
print(obj2) # <__main__.Foo object at 0x0000000000426C18>
Python:Day25 成员修饰符、特殊成员、反射、单例的更多相关文章
- 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式
本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...
- python - 类成员修饰符
在java,c#类的成员修饰符包括,公有.私有.程序集可用的.受保护的. 对于python来说,只有两个成员修饰符:公有成员,私有成员 成员修饰符是来修饰谁呢?当然是修饰成员了.那么python类的成 ...
- Python之 ---成员修饰符
一:成员修饰符:分为共有成员和私有成员: 私有成员:__通过两个下滑线:无法直接访问,要访问只能间接访问: 如下我们定义了一个对象,里面有两个共有的成员变量,成员变量是共有的时候我们可以外部访问,如果 ...
- Python面向对象之成员修饰符
对于这些类成员有修饰符 之前定义字段country任何对象都可以访问,是公有的 可以定义为私用属性,只有类内部的方法可以调用,外部不能直接调用,但是可以间接调用 vim day7-10.py #!/u ...
- Python面向对象(成员修饰符)
day25 成员修饰符 class Foo: def __init__(self, name, age): self.name = name self.__age = age#私有,外部无法直接访问 ...
- Python学习 :面向对象 -- 成员修饰符
成员修饰符 两种成员 - 公有成员 - 私有成员, __字段名 - 无法直接访问,只能通过内部方法来间接访问私有成员 简例:公有成员与私有成员 class Info: country = '中国' ...
- Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)
一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中 ...
- Python菜鸟之路:Python基础-类(2)——成员、成员修饰符、异常及其他
三大成员 在Python的面向对象中,主要包括三大成员:字段.方法.属性 字段 类成员的字段又可分为普通字段.静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,代码示例如下: ...
- python学习day20 面向对象(二)类成员&成员修饰符
1.成员 类成员 类变量 绑定方法 类方法 静态方法 属性 实例成员(对象) 实例变量 1.1实例变量 类实例化后的对象内部的变量 1.2类变量 类中的变量,写在类的下一级和方法同一级. 访问方法: ...
随机推荐
- canvas-8searchLight2.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Hibernate(链接数据库方便得多)!
首先让我们看一下配置文件,我这里先是用struts搞得controller,不明白struts的可以去百度一下这里就不讲解了: 之后我们需要做一个hibernate的配置文件内容如下(这里链接的是my ...
- IE浏览器的ActiveXObject对象以及FileSystemobject的应用扩展(完成)
ActiveXObject 对象 启用和返回对自动化对象的引用.此对象仅用于实例化自动化对象,且此对象没有成员. 警告:此对象为 Microsoft 扩展,仅在 Internet Explorer 中 ...
- BZOJ1101: [POI2007]Zap(莫比乌斯反演)
1101: [POI2007]Zap Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2951 Solved: 1293[Submit][Status ...
- 苹果手机如何投屏到win10电脑上
苹果手机中的IOS系统比安卓系统的确好用.苹果手机使用多久都不会出现手机卡顿的现象,一如既往的流畅自如,这就是人们追求苹果机的原因之一.苹果手机朋友们可能会觉得手机屏幕太小影响视觉怎么办,苹果手机如何 ...
- Mybatis使用动态代理实现拦截器功能
1.背景介绍 拦截器顾名思义为拦截某个功能的一个武器,在众多框架中均有“拦截器”.这个Plugin有什么用呢?或者说拦截器有什么用呢?可以想想拦截器是怎么实现的.Plugin用到了Java中很重要的一 ...
- 浅谈Kotlin(三):类
浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 已经学习了前 ...
- Java map 详解
Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值. 初始化一个集合: Map<String, String> map = ...
- filter帅选
var ages = [32, 33, 16, 40]; ages= ages.filter(function checkAdult(obj) {//obj表示数组中的每个元素 return obj ...
- Pycharm基本设置和插件安装
Pycharm调节主题和字体 调节主题:File - Setting - Editor - Color Scheme - 选择个人喜欢的风格 调节字体大小,感觉默认字体有点小,对我这样的老人家,至少要 ...