Python内置函数delattr的具体用法
作者:LZ_Luzhuo 发布时间:2023-04-22 05:35:22
标签:Python,delattr
delattr 函数用于删除属性。
delattr(x, 'foobar') 相等于 del x.foobar。
语法
setattr 语法:delattr(object, name)
参数
object -- 对象。
name -- 必须是对象的属性。
英文文档:
delattr(object, name)
This is a relative of setattr(). The arguments are an object and a string. The string must be the name of one of the object's attributes. The function deletes the named attribute, provided the object allows it. For example, delattr(x, 'foobar') is equivalent to del x.foobar.说明:
定义类
#coding=utf-8
# class_my.py 定义类 (新式类)
# 定义类
class Person:
# 类属性 (class) (注:类/类方法 能修改类属性; 对象不能修改类属性,更改的只是实例属性)
name = "name" # 公共属性
__adress = "adress" # 私有属性 (__属性 表示私有)
# 构造方法(对象创建调用) (__init__ 表示构造)
def __init__(self, name, address = "地球"):
# 实例属性
self.name = name # (注:类属性与实例属性名称相同时用实例属性,实例属性被删除后使用类属性)
self.__adress = address
Person.setData(self)
# 析构方法(对象销毁调用) (__del__ 表示析构)
def __del__(self):
print("对象被销毁.")
# toString()
def __str__(self):
return "Person.class"
# 实例方法 (this)
def setName(self, name): # self可为其他字符串 (this)
self.name = name; # 修改 实例属性 (不存在自动添加)
# 类方法 (static)
@classmethod
def setName_cls(cls, name):
cls.name = name # 修改 类属性
# 静态方法 (tools)
@staticmethod
def setName_sta(name): # (注:参数部分)
return name
def getName(self):
return self.name
def setData(self):
# 实例属性
self.__age = 21 # 私有属性
self.sex = "女" # 公共属性
def show(self):
print("Hello! %s"%self.name)
print("Address:%s"%self.__adress) # 使用自身私有属性
self.__eat() # 使用自身私有方法
def __eat(self): # 私有方法
print("eat")
# ======= 函数调用 ======
if __name__ == "__main__":
# - 创建对象 -
ps = Person("LY")
# --- 调用方法 ---
# 调用实例方法
ps.setName("LY") # 实例调用 实例方法
ps.show()
# 调用类方法
Person.setName_cls("Person") # 类调用 类方法
ps.setName_cls("Person") # 实例调用 类方法
# 调用静态方法 ()
print(ps.setName_sta("Per")) # 实例调用 静态方法
print(Person.setName_sta("Per")) # 类调用 静态方法
# --- 访问属性 ---
print(ps.getName())
print(ps.name) # 访问 类属性 的公共属性值
print(ps.sex) # 访问 实例属性 的公共属性值
# --- 修改属性 ---
# 修改实例属性
ps.name = "123" # 修改 类属性 (注:并非真修改,只是向对象中创建了一个实例属性)
del ps.name # 删除 实例属性 (注:实例不能(非类方法)删除 类属性, 只是删除了对象中创建的实例属性,类属性依然存在)
del ps.sex # 删除 实例属性 (注:真删除,删除后不能访问)
# 修改类属性
Person.name = "Person" # 修改类属性
Person.setName_cls("Person") # 类 调用 类方法 修改 类属性 (注:类不能调用实例方法)
ps.setName_cls("Person") # 对象 通过 类方法 修改 类属性
del Person.name # 删除类属性
# - 删除对象 -
del ps
# > Less is more! "静态方法"和"类方法/属性"同级都可理解为"静态",静态方法适合做工具箱,类方法/属性可认为在静态区,随手拿来即用,而实例则需要实例化才能使用. (--本人的个人理解)
# ======= 函数调用 ======
继承
#coding=utf-8
# class_extend.py 继承(新式类)
# --- 单继承 ---
# 父类
class Animal(object):
def __init__(self, name = "动物"):
self.name = name
def run(self):
print("%s在跑."%self.name)
# 子类
class Cat(Animal): # 继承 (父类写()内)
def __init__(self, name, ot = ""):
super(Cat, self).__init__(name)
def miao(self):
print("喵")
# --- 多继承 ---
class Donkey: # 驴
def walk(self):
print("walk")
def eat(self):
print("Donkey.eat")
class Horse: # 马
def run(self):
print("run")
def eat(self):
print("Horse.eat")
class Mule(Donkey, Horse): # 骡(驴+马)
pass
# === 多态 ====
def animalRun(animal): # 参数接收自己及其自己的子类
animal.run()
# ======= 函数调用 ======
if __name__ == "__main__":
# - 单继承调用 -
ani = Animal()
ani.run()
cat = Cat("猫")
cat.run()
cat.miao()
# - 多继承调用 -
mule = Mule()
mule.walk()
mule.run()
mule.eat() # 多个父类中有相同的方法时,调用()内最前面的父类(Donkey)的方法
# - 多态调用 -
ani = Animal()
animalRun(ani)
cat = Cat("猫")
animalRun(cat)
# ======= 函数调用 ======
重写
#coding=utf-8
# class_rewrite.py 重写(新式类)
class Animal(object):
def run(self):
print("Animal.run")
def eat(self, food = "食物"):
print("eat:%s"%food)
class Cat(Animal):
# 子类重写了父类的方法
def run(self):
print("Cat.run")
def eat(self):
# 调用父类的方法
super(Cat, self).eat("猫粮")
# ======= 函数调用 ======
if __name__ == "__main__":
ani = Animal()
ani.run()
ani.eat()
cat = Cat()
cat.run()
cat.eat()
# ======= 函数调用 ======
属性方法
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_propertiemethod.py 属性方法
# 属性方法: 把方法变成静态属性
# 写法1
class PM_1(object):
def __init__(self):
self.__name_str = "PropertieMethod_1"
# 获取
@property
def name(self): # 注意,方法名相同
return self.__name_str
# 设置
@name.setter
def name(self, name):
self.__name_str = name
# 删除
@name.deleter
def name(self):
del self.__name_str
if __name__ == "__main__":
pm = PM_1()
print(pm.name)
pm.name = "PM"
print(pm.name)
del pm.name
# print(pm.name)
# ==========================================================
# 写法2
class PM_2(object):
def __init__(self):
self.__name_str = "PropertieMethod_2"
# 获取
def getname(self):
return self.__name_str
# 设置
def setname(self, name):
self.__name_str = name
# 删除
def delname(self):
del self.__name_str
# property(fget=None, fset=None, fdel=None, doc=None) # 返回一个property 属性, 实现原理见 内置函数 文章 property_my 块代码(http://blog.csdn.net/rozol/article/details/70603230)
name = property(getname, setname, delname)
if __name__ == "__main__":
p = PM_2()
print(p.name)
p.name = "PM2"
print(p.name)
del p.name
# print(p.name)
反射
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_reflection.py 反射
# 通过反射机制,可动态修改程序运行时的状态/属性/方法
# Python的反射机制性能如何? 在Android中Java的反射产生垃圾而执行gc,从而导致UI不流畅,而且性能低
# Python的反射性能(1亿次测试): 直接获取属性值:反射获取属性值 = 1:1.164 ;直接设置属性值:反射设置属性值 = 1:1.754
def setname(self, name):
self.name = name
class Clazz(object):
def __init__(self):
self.name = "Clazz"
def getname(self):
return self.name
if __name__ == "__main__":
c = Clazz()
# --- 方法 ---
if hasattr(c, "getname"):
# 获取
method = getattr(c, "getname", None)
if method:
print("setname_ref: {}".format(method())) # 获取方法对象并执行
if not hasattr(c, "setname"):
# 添加
setattr(c, "setname", setname) # 添加方法
method = getattr(c, "setname", None)
if method:
method(c, "Reflection")
print("setname_raw: {}".format(c.getname()))
if hasattr(c, "setname"):
# 删除
delattr(c, "setname")
# c.setname(c, "Demo")
# --- 属性 ---
if not hasattr(c, "age"):
# 添加
setattr(c, "age", 21) # 添加方法
var = getattr(c, "age", None)
print("age_ref: {}".format(var))
print("age_raw: {}".format(c.age))
if hasattr(c, "age"):
# 获取
var = getattr(c, "age", None)
print("age_ref: {}".format(var))
if hasattr(c, "age"):
# 删除
delattr(c, "age")
# print("age_raw: {}".format(c.age))
文档注释
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_doc.py 文档注释
# 文档注释的编写
class Foo(object):
'''
这是一个类
'''
def method(self, data):
'''
这是一个方法
:param data: 需要的数据
:return: 返回的数据
'''
return "method"
def func(data):
'''
这是一个函数
:param data: 需要的数据
:return: 返回的数据
'''
return "func"
if __name__ == "__main__":
# 打印文档
print(Foo.__doc__)
print(Foo().method.__doc__)
print(func.__doc__)
创建类的原理
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_origin.py 类的由来
# 类由type类实例化产生, 而type由解释器产生
age = 21
def __init__(self):
self.name = "origin"
def getname(self):
return self.name
def setname(self, name):
self.name = name
def delname(self):
del self.name
if __name__ == "__main__":
# 用type创建类(类名, 基类元组, 类成员字典)
Foo = type('Foo', (object,), {'__init__' : __init__, "getname" : getname, "setname" : setname,
"delname": delname, "age" : age})
# 实例化类
f = Foo()
# 使用
print(f.age)
print(f.getname())
f.setname("ClassOrigin")
print(f.getname())
f.delname()
# print(f.getname())
# ==================================================================================
# 元类 (type创建类原理)
# 元类是用于创建所有类的类, Python中是type类 (注意,类也是对象,也是被创建出来的,即万物皆对象), 下面将演示type类的功能
# __call__ 的调用 (__new__在__init__之前调用, __call__在什么时候调用呢)
class Foobar(object):
def __call__(self, *args, **kwargs):
print("Foobar __call__")
if __name__ == "__main__":
fb = Foobar()
fb() # 只有在这个时候才会调用__call__属性
Foobar()() # 等同于该方式
# ------
# metaclass指定类有谁来创建
# Python创建类时会寻找__metaclass__属性,(包括父类)没有找到将使用内建元类type
class MyType(type):
def __init__(self, *args, **kwargs):
print("MyType __init__")
def __call__(self, *args, **kwargs):
print("MyType __call__")
obj = self.__new__(self)
self.__init__(obj, *args, **kwargs)
return obj
def __new__(cls, *args, **kwargs):
print("MyType __new__")
return type.__new__(cls, *args, **kwargs)
class Foo(object, metaclass=MyType): # (Python3.x写法) metaclass 用于创建类, Python创建类时会寻找__metaclass__属性,(包括父类)没有找到将使用内建元类type
# __metaclass__ = MyType # Python2.x写法
def __init__(self):
print("Foo __init__")
def __new__(cls, *args, **kwargs): # 用于实例化对象
print("Foo __new__")
return object.__new__(cls) # 必须是返回
def show(self):
print("Foo show")
if __name__ == "__main__":
print("start")
f = Foo()
f.show()
# MyType __new__ => MyType __init__ => 'start' => MyType __call__ => Foo __new__ => Foo __init__ => 'Foo show'
其他的一些补充
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_other.py 关于类的一些补充
class Demo(object):
def show(self):
print("Demo show")
if __name__ == "__main__":
# __module__ 该对象的模块名
# __class__ 该对象的类对象
print(Demo.__module__) # 该对象的模块名 => __main__
print(Demo.__class__) # 该对象的类对象 => <class 'type'>
obj = Demo()
print(obj.__module__) # 该对象的模块名 => __main__
print(obj.__class__) # 该对象的类对象 => <class '__main__.Demo'>
obj.__class__.show(obj) # 类对象可被使用
# ============================
# __dict__ 类或对象中的所有成员
print(Demo.__dict__) # 类属性
print(obj.__dict__) # 实例属性
来源:http://blog.csdn.net/rozol/article/details/69317339


猜你喜欢
- MySQL去重的方法整理【初级】有极少的重复行使用distinct查出来,然后手动一行一行删除。【中级】按照单个字段的重复去重例如:对id字
- 前言前面我们已经将GO的环境安装好了,那么是否可以进行开发了呢?可以,但是为了能够更高效率的开发,我们还需要下载一个软件,该软件的作用就是方
- Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下
- 普通爬虫正常流程:数据来源分析发送请求获取数据解析数据保存数据环境介绍python 3.8pycharm 2021专业版【付费VIP完整版】
- 如下所示:def translationCipher(msg,key): result = ["&quo
- 本文主要介绍如何通过python生成ppt文件,以及借助ppt模板来生成ppt环境python 3python-pptx安装pip3 ins
- 本文实例讲述了Python3.5局部变量与全局变量作用域。分享给大家供大家参考,具体如下:1、局部变量与全局变量定义:在子程序(函数)中定义
- 引入先安装三个模块pip install channelspip install channels_redispip install pyw
- 对数字货币的崛起感到新奇的我们,并且想知道其背后的技术——区块链是怎样实现的。 但是完全搞懂区块链并非易事,我喜欢在实践中学习,通
- Jupyter Notebook是一个基于浏览器的交互式编程环境(REPL, read eval print loop),它主要构建在IPy
- 一、什么是XSS攻击xss攻击:----->web注入xss跨站脚本攻击(Cross site script,简称xss)是一种“HT
- 在Python 2.7中,一个float的repr返回最接近十七位数的十进制数;这足以精确地识别每个可能的IEEE浮点值.浮点数的str类似
- python如何将字母转化为数字?将英文字母转成数字:转换ord('F')反转chr(70)python ord() 函数是
- 一:取字符串中第几个字符print "Hello"[0] 表示输出字符串中第一个字符print "Hello&
- 农业银行总行1998年以来正式推广了新版网络版综合业务统计信息系统,该系统是基于WindowsNT4.0平台,采用客户/服务器模式,以Mic
- 前言1.工作中,经常需要合并多个Excel文件。如果文件数量比较多,则工作量大,易出错,此时,可以使用Python来快速的完成合并。2.使用
- JavaScript本身作为一门简单的语言,就其变量作用域问题一样令不少人头晕,这主要是因为JavaScript闭包的存在。本文不打算深入讲
- 由于asp中是使用双引号作为字符串的开始和结束标志的,单一个字符串中的双引号出现次数大于两个时,程序就有可能运行错误。asp中是怎么输出引号
- 前言本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解。EOMONTH在SQL Server 2012的教程示例中,
- 一、YAML是什么YAML是专门用来写配置文件的语言,远比JSON格式方便。YAML语言的设计目标,就是方便人类读写。YAML是一种比XML