一、成员修饰符

  共有成员

  私有成员,__字段名,__方法

    - 无法直接访问,只能间接访问

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 成员修饰符、特殊成员、反射、单例的更多相关文章

  1. 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

    本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...

  2. python - 类成员修饰符

    在java,c#类的成员修饰符包括,公有.私有.程序集可用的.受保护的. 对于python来说,只有两个成员修饰符:公有成员,私有成员 成员修饰符是来修饰谁呢?当然是修饰成员了.那么python类的成 ...

  3. Python之 ---成员修饰符

    一:成员修饰符:分为共有成员和私有成员: 私有成员:__通过两个下滑线:无法直接访问,要访问只能间接访问: 如下我们定义了一个对象,里面有两个共有的成员变量,成员变量是共有的时候我们可以外部访问,如果 ...

  4. Python面向对象之成员修饰符

    对于这些类成员有修饰符 之前定义字段country任何对象都可以访问,是公有的 可以定义为私用属性,只有类内部的方法可以调用,外部不能直接调用,但是可以间接调用 vim day7-10.py #!/u ...

  5. Python面向对象(成员修饰符)

    day25 成员修饰符 class Foo: def __init__(self, name, age): self.name = name self.__age = age#私有,外部无法直接访问 ...

  6. Python学习 :面向对象 -- 成员修饰符

    成员修饰符 两种成员 - 公有成员 - 私有成员, __字段名 - 无法直接访问,只能通过内部方法来间接访问私有成员 简例:公有成员与私有成员  class Info: country = '中国' ...

  7. Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)

    一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中 ...

  8. Python菜鸟之路:Python基础-类(2)——成员、成员修饰符、异常及其他

    三大成员 在Python的面向对象中,主要包括三大成员:字段.方法.属性 字段 类成员的字段又可分为普通字段.静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,代码示例如下: ...

  9. python学习day20 面向对象(二)类成员&成员修饰符

    1.成员 类成员 类变量 绑定方法 类方法 静态方法 属性 实例成员(对象) 实例变量 1.1实例变量 类实例化后的对象内部的变量 1.2类变量 类中的变量,写在类的下一级和方法同一级. 访问方法: ...

随机推荐

  1. POJ2484

    A Funny Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6178   Accepted: 3861 Desc ...

  2. Glass Dragon

    3 minutes by 3Delight 11.0.148

  3. CSS回顾(基础知识,元素,选择器,盒子,颜色)

    元素分类: 1.行级元素:内联元素  inline 特征:内容决定元素所占位置,不可以通过CSS改变宽高 span  strong   em  a  del 2.块级元素:block特征:独占一行,可 ...

  4. springboot 学习之路 9 (项目启动后就执行特定方法)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  5. SQL Server如何查找表名或列名中包含空格的表和列

    最近发现一个数据库中的某个表有个字段名后面包含了一个空格,这个空格引起了一些小问题,一般出现这种情况,是因为创建对象时,使用双引号或双括号的时候,由于粗心或手误多了一个空格,如下简单案例所示: USE ...

  6. [20181220]使用提示OR_EXPAND优化.txt

    [20181220]使用提示OR_EXPAND优化.txt --//链接http://www.itpub.net/thread-2107240-2-1.html,http://www.itpub.ne ...

  7. MSSQL coalesce系统函数简介

    转自:http://www.maomao365.com/?p=4390 一.coalesce函数简介 coalesce 系统函数,比ISNULL更强大,更方便的系统函数,coalesce可以接收多个参 ...

  8. MySQL 5.7安装指南

    1.下载 1)进入官网下载5.7.23压缩包 下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 2.安装与配置 1)将下载的压 ...

  9. 在微信小程序中使用LeanCloud(一)

    之前学习了微信小程序前端,使用到LeanCloud线上数据库 [传送门].作为一个前端开发人员,了解后端及数据库是学习工作的需要. LeanCloud直接登录,未注册直接创建账户.它是一款免费的线上数 ...

  10. java开发基础知识学习

    java环境配置 classpath: .当前目录 path: java 命令所在目录 jdk安装目录 jdk/bin jre安装目录 jre/bin 安装JDK后配置环境变量如下: 安装过程用到了j ...