总结:和类的关联性讲:属性方法>类方法>静态方法

属性方法@property:仅仅是调用方式不用+括号。

类方法@classmethod:访问不了累的属性变量,只可以访问类变量。

静态方法@staticmethod:仅仅是通过类名来调用这个函数而已,和类本身已经没有功能关系了,严格讲已经不是类的方法而是一个通过类名调用的函数而已(无法访问实例化的类的任何属性过着其他方法)。

在类中的方法加如下装饰器

属性方法:@property将方法变为类的一个静态属性,调用的时候无需加括号。对外隐藏实现细节,对于用户来讲,感觉就是在查一个写死的

class Flight(object):
def __init__(self,name):
self.name = name
# flight_status
def check_flight(self):
print('checking flight %s: status'% self.name)
status = 3
return status
@property #为类的一个静态属性,调用的时候无需加括号。对外隐藏实现细节,对于用户来讲,感觉就是在查一个写死的静态属性
def flight_status(self):
status = self.check_flight
if status == 0:
print('flight got canceled...')
elif status == 1:
print('flight is arrived...')
elif status == 2:
print('flight has departured already...')
else:
print('cannot confirm the flight status ....please check later')
@flight_status.setter #对属性方法里面的参数进行修改
def flight_status(self,status):
self.check_flight = status
status_dict = {
0:'canceled',
1:'arrived',
2:'departured'
}
print('\033[31;1mhas changed flight:%s status to:%s\033[0m'%(self.name,status_dict[status]))
@flight_status.deleter #加上删除装饰器,这个静态方法就可以被删除
def flight_status(self):
print('status Func got removed') f1 = Flight("川航3U8633")
f1.flight_status #不用加括号
f1.flight_status = 1
f1.flight_status
del f1.flight_status
f1.flight_status

更改航班状态(属性方法应用)

静态方法:@staticmethod

只是名义上归类管理,实际上在静态方法里访问不了类或者实例的任何属性

class Dog(object):

    def __init__(self,name):
self.name = name
def talk(self):
print('%s talking: 旺旺旺!'% self.name)
@staticmethod
def eat(self,food):
print('%s eating %s'%(self.name,food)) d1 = Dog('ChenRonghua')
d1.eat('包子')
Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/Python3_study/day6/静态方法_类方法.py", line 15, in <module>
d1.eat('包子')
TypeError: eat() missing 1 required positional argument: 'food'

类方法:@classmethod

只能访问类变量,不能访问实例变量

class Dog(object):
name = '类方法调用测试用类变量'
def __init__(self,name):
self.name = name
def talk(self):
print('%s talking: 旺旺旺!'% self.name)
# @staticmethod
@classmethod
def eat(self,food):
print('%s eating %s'%(self.name,food))
d1 = Dog('ChenRonghua')
d1.eat('包子')
类方法调用测试用类变量 eating 包子

Process finished with exit code 0

类的内置方法__doc__

class Dog(object)

class Dog(object):
'''描述一个狗的样子'''
pass
print(Dog.__doc__)

输出:描述一个狗的样子

 类的内置方法__module__;__class__

class C(object):
pass

lib/test.py

from lib import test
obj = test.C()
print(obj.__module__)
print(obj.__class__)

测试.py

输出结果
lib.test
<class 'lib.test.C'>

 

3. __init__ 构造方法,通过类创建对象时,自动触发执行。

4.__del__

 析构方法,当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

  

 5. __call__ 对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

 

class Dog(object):
name = '类方法调用测试用类变量'
def __init__(self,name):
self.name = name
# def talk(self):
# print('%s talking: 旺旺旺!'% self.name)
# # @staticmethod
# @classmethod
# def eat(self,food):
# print('%s eating %s'%(self.name,food))
def __call__(self, *args, **kwargs):
print("我了个__call__")
d1 = Dog('ChenRonghua')
d1() 输出:我了个__call__

6.__dict__ 查看类或对象中的所有成员变量   

class Dog(object):
name = '类方法调用测试用类变量'
def __init__(self,name):
self.name = name def __call__(self, *args, **kwargs):
print("我了个__call__")
d1 = Dog('ChenRonghua')
print(d1.__dict__)
print(Dog.__dict__)
输出:
{'name': 'ChenRonghua'}
{'__module__': '__main__', 'name': '类方法调用测试用类变量', '__init__': <function Dog.__init__ at 0x0000002A9CE32AE8>, '__call__': <function Dog.__call__ at 0x0000002A9CE32B70>, '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}

7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Dog(object):
def __str__(self):
return "我是类中__str__方法 return的字符串"
def __init__(self,name):
self.name = name d1 = Dog('ChenRonghua') print(d1)
输出:我是类中__str__方法 return的字符串

8.__getitem__、__setitem__、__delitem__

用于索引操作,如过一个类的属性中有类似字典格式的数据。以上内置方法 分别表示获取、设置、删除 该类实例化的实例属性中的数据

class Foo(object):
def __init__(self):
self.data = {}
def __setitem__(self, key, value):
self.data[key] = value
def __getitem__(self, key):
return self.data.get(key) #字典的get(key)方法,不会因为没有key报错
def __delitem__(self, key):
print('\033[32;1m你让我删,我就删啊\033[0m')
del self.data[key]
obj = Foo()
obj['name'] = 'zhangmingda' #自动触发执行__setitem__(self, key, value):
obj['age'] = 23
print(obj.data)
value = obj['age'] #自动触发执行__getitem__(self, key):
print(value)
del obj['age'] #自动触发执行__delitem__(self, key):

{'name': 'zhangmingda', 'age': 23}
23
你让我删,我就删啊 Process finished with exit code 0

输出结果

类的起源:type

def func(self):
print('我是类的方法,不是函数')
def __init__(self,name,age):
self.name = name
self.age = age
Foo = type('Foo',(object,),{'func':func,'__init__':__init__})#定义一个类的原始写法'func'和'__init__'为类的方法名
f1 = Foo('zhangmingda',23)
f1.func()
print(f1.name,f1.age)
我是类的方法,不是函数
zhangmingda 23

自定义一个原类 :__metaclass__

__metaclass__:作用-->定义一个类创建的过程

class MyType(type):
def __init__(self,*args,**kwargs):
print("Mytype __init__",*args,**kwargs) def __call__(self, *args, **kwargs):
print("Mytype __call__", *args, **kwargs)
obj = self.__new__(self)
print("obj ",obj,*args, **kwargs)
print(self)
self.__init__(obj,*args, **kwargs)
return obj def __new__(cls, *args, **kwargs):
print("Mytype __new__",*args,**kwargs)
return type.__new__(cls, *args, **kwargs) print('here...')
class Foo(object,metaclass=MyType):
# __metaclass__ = MyType
def __init__(self,name):
self.name = name
print("Foo __init__") def __new__(cls, *args, **kwargs): #new的作用,将类实例化。没有new,__init__(self)构造函数不会执行
print("Foo __new__",cls, *args, **kwargs)
return object.__new__(cls) #继承原类 f = Foo("Alex")
print("f",f)
print("fname",f.name)

__metaclass__

内建属性__init__ ; __getattribute__

子类没有实现__init__方法时,默认自动调用父类的。 如定义__init__方法时,需自己手动调用父类的 __init__方法

常用专有属性 说明 触发方式
__init__ 构造初始化函数 创建实例后,赋值时使用,在__new__
__new__ 生成实例所需属性 创建实例时
__class__ 实例所在的类 实例.__class__
__str__ 实例字符串表示,可读性 print(类实例),如没实现,使用repr结果
__repr__ 实例字符串表示,准确性 类实例 回车 或者 print(repr(类实例))
__del__ 析构 del删除实例
__dict__ 实例自定义属性 vars(实例.__dict__)
__doc__ 类文档,子类不继承 help(类或实例)
__getattribute__ 属性访问拦截器 访问实例属性时
__bases__ 类的所有父类构成元素 类名.__bases__

__getattribute__例子:

class Itcast(object):
def __init__(self,subject1):
self.subject1 = subject1
self.subject2 = 'cpp' #属性访问时拦截器,打log
def __getattribute__(self,obj):
if obj == 'subject1':
print('log subject1')
return 'redirect python'
else: #测试时注释掉这2行,将找不到subject2
return object.__getattribute__(self,obj) def show(self):
print('this is Itcast') s = Itcast("python")
print(s.subject1)
print(s.subject2)
#运行结果: log subject1
redirect python
cpp

__getattribute__的坑

    class Person(object):
def __getattribute__(self,obj):
print("---test---")
if obj.startswith("a"):
return "hahha"
else:
return self.test def test(self):
print("heihei") t.Person() t.a #返回hahha t.b #会让程序死掉
#原因是:当t.b执行时,会调用Person类中定义的__getattribute__方法,但是在这个方法的执行过程中
#if条件不满足,所以 程序执行else里面的代码,即return self.test 问题就在这,因为return 需要把
#self.test的值返回,那么首先要获取self.test的值,因为self此时就是t这个对象,所以self.test就是
#t.test 此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产
#生了递归调用,由于这个递归过程中 没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为
#每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序 崩溃
#
# 注意:以后不要在__getattribute__方法中调用self.xxxx

Python 属性方法、类方法、静态方法、 特殊属性__doc__ (内建属性)的更多相关文章

  1. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  2. Python普通方法、静态方法、类方法

    开始 # -*-coding:utf-8-*- # 普通方法,类方法,静态方法的区别 __metaclass__ = type class Tst: name = 'tst' data = 'this ...

  3. python 内建属性

    在python中创建一个类,它不仅有我们自定义的属性和方法,还有与生俱来的一些属性和方法,我们叫它内建属性. 下面是类常用内建属性列表. 常用专有属性 说明 触发方式 __init__ 构造初始化函数 ...

  4. 类装饰器,元类,垃圾回收GC,内建属性、内建方法,集合,functools模块,常见模块

    '''''''''类装饰器'''class Test(): def __init__(self,func): print('---初始化---') print('func name is %s'%fu ...

  5. Python属性和内建属性

    属性property 1. 私有属性添加getter和setter方法 class Money(object): def __init__(self): self.__money = 0 def ge ...

  6. 13 内建属性 _getattribute_ 内建函数

    1.内建属性 2.__getattribute__ 属性访问时拦截器 class Itcast(object): def __init__(self,subject1): self.subject1 ...

  7. python学习笔记(二十二)实例变量、实例方法、类变量、类方法、属性方法、静态方法

    实例变量:在类的声明中,属性是用变量来表示的.这种变量就称为实例变量,也就是成员变量. 实例方法:在类中声明的方法,例如:my(self),必须实例化之后才可以使用,否则会报错. 类变量:公共的变量, ...

  8. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  9. Python的实例方法,类方法,静态方法之间的区别及调用关系

    如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...

随机推荐

  1. Codeforces 338E - Optimize!(Hall 定理+线段树)

    题面传送门 首先 \(b_i\) 的顺序肯定不会影响匹配,故我们可以直接将 \(b\) 数组从小到大排个序. 我们考虑分析一下什么样的长度为 \(m\) 的数组 \(a_1,a_2,\dots,a_m ...

  2. Topcoder 12519 ScotlandYard(点对 dp+最长路)

    题面传送门 题意: 有两个人 A 和 B 玩一个游戏.游戏规则大致是这样的: 有 \(n\) 个城市和三种交通工具公交.地铁和出租车. 给出三个 \(n\times n\) 的字符矩阵 \(b,m,t ...

  3. Codeforces 348C - Subset Sums(根号分治)

    题面传送门 对于这类不好直接维护的数据结构,第一眼应该想到-- 根号分治! 我们考虑记[大集合]为大小 \(\geq\sqrt{n}\) 的集合,[小集合]为大小 \(<\sqrt{n}\) 的 ...

  4. 1D RKDG to shallow water equations

    RKDG to shallow water equations 1.Governing Equations \[\frac{\partial U}{\partial t} + \frac{\parti ...

  5. 详细解析Thinkphp5.1源码执行入口文件index.php运行过程

    详细解析Thinkphp5.1源码执行入口文件index.php运行过程 运行了public目录下的index.php文件后,tp的运行整个运行过程的解析 入口文件index.php代码如下: < ...

  6. 硬盘SSD、HDD和SSHD都是什么意思?哪种类型硬盘最好?

    硬盘分类:(1)HHD 机械硬盘(Mechanical hard disk)(2)SSD 固态硬盘(solid state drive/disk)(3)SSHD 混合硬盘,说白了就是HDD+SSD=S ...

  7. echarts中饼状图数据太多进行翻页

    echarts饼状图数据太多 echarts 饼状图内容太多怎么处理 有些时候,我们饼状图中echarts的数据可能会很多. 这个时候展示肯定会密密麻麻的.导致显示很凌乱 我们需要'翻页'类似表格展示 ...

  8. mysql数据定义语言DDL

    库的管理 创建 create 语法:create database 库名 [character set 字符集] # 案例:创建库 create database if not exists book ...

  9. day02 web主流框架

    day02 web主流框架 今日内容概要 手写简易版本web框架 借助于wsgiref模块 动静态网页 jinja2模板语法 前端.web框架.数据库三种结合 Python主流web框架 django ...

  10. day11 系统安全

    day11 系统安全 复习总结 文件 1.创建 格式:touch [路径] [root@localhost ~]# touch 1.txt # 当前路径创建 [root@localhost ~]# t ...