在python的类中,除了常规的一些自定义函数调用之外还有一些内置函数或方法,大多数情况下不会用到,但是为了更好的学习到python类的原理也需要对其有一定的了解,下面我们一起来看一下都具体包含了那些内容。

1 静态方法

  @staticmethod 本质为装饰器,可以理解为:名义归类管理,但实际上在静态方法里访问不了类或示例中的任何属性,相当于装饰成了类的高级工具包。

2 类方法

  @classmethod 本质为装饰器,只能访问类变量,不能访问示例变量。

__Author__ = "Panda-J"

class Person(object):
name = "Shuaige"
def __init__(self,name):
self.name = name
print("this is %s name"%name)
@classmethod
def Test_method(self):
print("%s is this name."%self.name)
Person.Test_method()
Person("Meinv")

3 属性方法

  @property 本质为装饰器,把一个方法变成一个静态属性,不能在后面加括号进行调用。如果必须传参数进行调用的话必须引入一个相同名字的函数,并加上@[name].setter装饰器中进行参数传递。属性方法是无法进行删除。删除用@[name].deleter中使用del命令才能删除

@property
def eat(self):
print("I love eat",self.__food)
@eat.setter
def eat(self,food):
print("set food :",food)
self.__food = food
@eat.deleter
def eat(self):
del self.__food
print("删完了")
p.eat#此处不需要加括号进行调用
p.eat="baozi"#将“baozi”传进了__food中,调用了@eat.setter函数
p.eat

  

4 特殊成员方法

  __doc__:储存类下用于注释该类的用法的内容。

class Person(object):
'''这是描述人类基本信息的类'''
print(p.__doc__)

  __module__:表示当前操作的对象在哪个模块中;__class__:表示当前操作的对象在哪个类中。

  __init__:构造方法,通过创造对象时,自动执行

  __del__:析构方法,当对象在内存中释放的时候将自动执行析构方法。

  __call__:可调用函数,使该对象具有可调用的功能。即相当于是该类可以使用两个括号进行引用,执行call中的语句:Person()()

class Person(object):
def __call__(self, *args, **kwargs):
print("your are great",args,kwargs,"thanks for your hardworking")
p = Person("Jiang")
p("Jiang","Lirui")

  __dict__:调用前表示该类所具有的所有属性。调用后表示该示例所具有的属性

print(Person.__dict__)
p = Person("Jiang")
print(p.__dict__)

  __str__:返回一个值而不是地址

    def __str__(self):
print("<welcome>",self.name)
print(p)

  __getitem__\__setitem__\__delitem__:此类方法最大的好处就在于可以将一个实例封装(伪装)成一个字典,用户调用和字典的方式完全一样,可以在类中加入限制调用以及更多的操作方法,丰富“字典”的使用方法。

    def __getitem__(self, item):
print("this running getitem %s progress"%item)
return self.data.get(item)
def __setitem__(self, key, value):
self.data[key] = value
def __delitem__(self, key):
del self.data[key]
p = Person("Jiang")
p["look"] = "perfomanced"
p["smell"] = "good"
print(p["look"])
del p["look"]
print(p.data)

  

  type:装逼的类创建,从此也可以看出Person即为type的一个示例(对象),也是一个类,所以type可以成为“类的类“。可以

 

def func(self):
print("this is a function") def __init__(self, name, age):
self.name = name
self.age = age Person = type("Person", (object,), {"func_name": func,
"__init__": __init__}) # 进行一个类的创建
p = Person("Jiang", 24)
p.func_name()

  

  __new__:可以自己封装一个类(对类的自定义化),__new__先于__init__执行。在python2.x中是由__call__函数创建。创建new的时候一定注意需要返回一个”cls“用于创建类。如果没有return将不会创建一个真正的实例

    def __new__(cls, *args, **kwargs):
print("this is new",args)
return object.__new__(cls)#继承父亲的__new__方法。

  __metacalss__:是一个很神奇的函数---元类。在python2.x的版本中可以看出差别,在3.x中有所区别。感兴趣的朋友可以试一下。用这个的目的就是为了自定义类,而不是按照系统默认的方法进行类的创建。

class Mytype(type):#定义一个元类
def __init__(self,what,base=None,dict=None):#重构init,加入自定义功能。
print('=======This is Mytype init=======')
super(Mytype,self).__init__(what,base,dict)#继承init,可正常实例化。
def __call__(self, *args, **kwargs):
print('=====This is Mytype call=====')
# obj=self.__new__(self,*args,**kwargs)
# self.__init__(obj,*args,**kwargs) class Person(object):
__metaclass__=Mytype#该对象以Mytype定义的形式进行创建
def __init__(self,name):
self.name = name
print("--Init the %s Person"%name)
def __new__(cls, *args, **kwargs):
print("--Person new %s"%args)
return object.__new__(cls)
p = Person("Jiang")

  

  在python2.x中执行的效果就是这样:

  由此可以看出是先执行了Mytype中自定义类的程序,再执行了Foo类的创建程序。详情请参阅StackOverflow上的链接。

在类方法中一个比较重要的来了

4 反射:

  1 hasattr(obj,name_str)--判断一个对象是否由对应(name_str)的字符串方法,有返回True,无返回False

  2 getattr(obj,name_str)--获得该字符串对应的函数/方法的内存方法

  3 setattr('x','y','v')--相当于x.y=v,但不等于,无法直接使用x.y。会提示在x中找不到y方法。可赋值给一个变量a=getattr(x,y),让变量去调用函数a()。动态的内存交互。

  4 delattr(obj,name_str)--删除obj中的name_str方法。

所有的方法都在下面的代码中使用,请参考:

def bulk(self):
print("%s is yelling"%self.name)#self.name用的就是Person里的self.name
class Person(object):
def __init__(self,name):
self.name = name#类的结构化
def eat(self,food):
print("%s is eating %s"%(self.name,food)) d = Person("Jiang")
print(d.name)
choice = input(">>".strip())#输入一个属性
if hasattr(d,choice):#判断是否具有“choice”
func = getattr(d,choice)#将d.choice的地址赋值给func
func("Banana")#对d.choice的调用
delattr(d, choice)#删除choice这个属性
else:
setattr(d,choice,bulk)#将bulk方法归在类下
c = getattr(d,choice)#将d.choice的地址赋值给c
c(d)#调用c
print(d.name)

  

  

  

python 常用方法的更多相关文章

  1. Python常用方法

    Python strip()方法 描述: Python strip()方法用于移除字符串头尾指定的字符(默认为空格). 语法: str.strip([chars]) 参数: chars -- 移除字符 ...

  2. python常用方法总结

    1.os模块的路径拼接: import os now_path=os.path.abspath(__file__)#当前运行文件的路径 print(now_path) uppeer_path=os.p ...

  3. Python 常用方法和模块的使用(time & datetime & os &random &sys &shutil)-(六)

    1 比较常用的一些方法 1.eval()方法:执行字符串表达式,并返回到字符串. 2.序列化:变量从内存中变成可存储或传输到文件或变量的过程,可以保存当时对象的状态,实现其生命周期的延长,并且需要时可 ...

  4. python常用方法详解

    1,讲序列分解为单独的变量 p=(4,5) x,y=p print(x,y) 如果在分解中想丢弃某些特定的值,可以采用_来进行 data=['A','B','c','d'] _,name,age,_= ...

  5. odoo之ERP系统

    odoo大纲 第一部分:数据库postgressql 大象 第二部分:ORM(API) 第三部分:客户端 用python软件写: .py文件 包含两部分:1.自定义部分,由自己写,定义类和功能. .继 ...

  6. python浅谈正则的常用方法

    python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去 ...

  7. python中的常用方法

    1.os模块的常用方法: >>> import os >>> >>> myFiles = ['accounts.txt', 'details.cs ...

  8. python字符串,列表,字典的常用方法

    本篇内容 字符串的常用方法 列表的常用方法 字典的常用方法 字符串的常用方法 center 字符居中显示,指定字符串长度,填充指定的填充字符 string = "40kuai" p ...

  9. 下篇:python的基本数据类型以及对应的常用方法(列表、元组、字典、集合)

    为了日后便于查询,本文所涉及到的所有命令集合如下: python中的基本数据类型有数字.字符串.布尔值.列表.元组.字典.就像每一个职业有自己特定的技能,比如医生能看病,农民能种田,每种数据类型也有属 ...

随机推荐

  1. 【深度学习系列】用PaddlePaddle进行车牌识别(一)

    小伙伴们,终于到了实战部分了!今天给大家带来的项目是用PaddlePaddle进行车牌识别.车牌识别其实属于比较常见的图像识别的项目了,目前也属于比较成熟的应用,大多数老牌厂家能做到准确率99%+.传 ...

  2. angular4升级angular5问题记录之this.location.back()

    在之前的项目中,导航回上一个路由采用注入的Location服务,利用浏览器的历史堆栈,导航到上一步. 官方文档也就是这么写的 而然在升级到5.2的版本的时候,在浏览器运行的时候并没有什么问题,在项目打 ...

  3. Mysql数据库建立索引的优缺点有哪些?

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 例如这样一个查询:select * ...

  4. 进入Docker容器

    在进入Docker容器之前,首先要运行对应的Docker容器,先使用命令docker ps查看正在运行的容器. docker inspect --format='{{.NetworkSettings. ...

  5. 生成1~n的排列

    直接递归打印. 代码如下 #include<cstdio> void dfs(int *a,int cur,int n) { if(cur==n) { for(int i=0;i<n ...

  6. POJ1459 - Power Network

    原题链接 题意简述 原题看了好几遍才看懂- 给出一个个点,条边的有向图.个点中有个源点,个汇点,每个源点和汇点都有流出上限和流入上限.求最大流. 题解 建一个真 · 源点和一个真 · 汇点.真 · 源 ...

  7. @EnableAsync @Asnc 以及4种拒绝策略

    根据不同的场景,可以选择不同的拒绝策略,如果任务非常重要,线程池队列满了,可以交由调用者线程同步处理. 如果是一些不太重要日志,可以直接丢弃掉. 如果一些可以丢弃,但是又需要知道被丢弃了,可以使用Th ...

  8. Android使用百度地图出现闪退及定位时显示蓝屏问题

     目录 1.Android使用百度地图出现闪退 2.Android使用百度地图定位出现蓝屏问题     1.Android使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.x ...

  9. yum源配置的三种方法

    (一)yum源概述 yum需要一个yum库,也就是yum源.默认情况下,CentOS就有一个yum源.在/etc/yum.repos.d/目录下有一些默认的配置文件(可以将这些文件移到/opt下,或者 ...

  10. Linux shell的问题

    1.uptime命令可以查看当前系统的启动时间: w命令显示当前登录者top命令显示当前任务ps命令显示所有进程信息 uptime命令可以查看系统启动时间   2.使用shell时,默认的环境变量放在 ...