随笔 - 105  文章 - 0  评论 - 0  阅读 - 40744

面向对象进阶

一、静态方法:

特征:静态方法只是名义上归类管理,实际和类没任何关联,访问不了类的任何属性

使用方法:@staticmethod

      def method()

 

二、类方法 @classmethod

特征:只能访问类变量,不能访问实例变量

 

三、属性方法 @property

把一个类方法变成属性。例子如下:

 

复制代码
class People(object):
    def __init__(self, name):
        self.name = name

    @property  # 变成属性方法,但不能赋值
    def eat(self):
        print('{}正在吃!'.format(self.name))

    @eat.setter  # 也是一个属性,同时使用赋值语句则调用此方法,必须在@property下
    def eat(self, food):
        print('{}正在吃{}!'.format(self.name, food))

    @eat.deleter  # 也是删除,在del p1.eat中调用,必须在@property下
    def eat(self):
        print('已经删除')


p1 = People('LiZuoQi')
p1.eat  # 调用15行的eat
p1.eat = ''  # 调用19行的eat,并能给参数赋值
del p1.eat  # 调用24行的eat
复制代码

 

 

四、类的特殊成员方法

1、__doc__:用于打印类的描述信息,一个隐藏属性,例子如下:

class Dog(object):
    """此类用于描述狗"""

    def __init__(self, name):
        self.name = name


print(Dog.__doc__)

 

2、__module__:属性,模块名

    __class__:属性,类名

例子:

 

from lib.aa import C
obj = C('LiZuoQi')
print(obj.__module__)   # 输出模块名
print(obj.__class__)  # 输出类名

 

class C(object):
    def __init__(self, name):
        self.name = name

3、__call__方法:类中特殊的方法。

调用方法:obj(<参数>),例子如下:

复制代码
class Dog:
    def __init__(self,name):
        self.name = name

    def bulk(self):
        print('%s:wang wang wang' % self.name)

    def __call__(self, *args, **kwargs):
        print('running call')


d1 = Dog('LiZuoQi')
d1()  # 此处运行结果会显示running call
复制代码

4、__dict__:属性,

class.__dict__:打印类中的所有属性,但不包括实例属性

obj.__dict__:打印实例中的属性,但不包括类属性

复制代码
class Dog:
    def __init__(self,name):
        self.name = name

    def bulk(self):
        print('%s:wang wang wang' % self.name)

    def __call__(self, *args, **kwargs):
        print('running call')


print(Dog.__dict__)
d1 = Dog('LiZuoQi')
print(d1.__dict__)
复制代码

 5、__str__:方法

外部调用方法:print(obj_name)即触发执行,默认打印对象的内存地址,可重写,例子:

复制代码
class Dog:
    def __init__(self,name):
        self.name = name

    def bulk(self):
        print('%s:wang wang wang' % self.name)

    def __call__(self, *args, **kwargs):
        print('running call')

    def __str__(self):
        return 'Obj:{}'.format(self.name)


d1 = Dog('LiZuoQi')
print(d1)
复制代码

6、__setitem__:方法,在实例中用字典的方式赋值时触发obj[key]=val

    __getitem__:在实例中用字典的方式获取键对应的值时触发obj[key]

    __delitem__:del obj[key]时触发

复制代码
class Dog:
    def __init__(self,name):
        self.name = name

    def bulk(self):
        print('%s:wang wang wang' % self.name)

    def __setitem__(self, key, value):
        print('in the setitem')

    def __getitem__(self, item):
        print('in the getitem')

    def __delitem__(self, key):
        print('in the delitem')


d1 = Dog('LiZuoQi')
d1['name'] = 'alex'
d1['name']
del d1['name']
复制代码

 7、

(1)、所有类的起源均是type

声明类可使用一个特殊的方法,例子,如下:

复制代码
def __init__(self, name ,age):
    self.name = name
    self.age = age


def talk(self):
    print('%s is talking'% self.name)


FOO = type('FOO', (object,), {'__init__':__init__,    # 此处利用type定义了一个类
                              'talk': talk})

f = FOO('LiZuoQi', 13)
f.talk()
复制代码

(2)、__new__方法:用于创建实例,调用__init__函数

__metaclass__:类中有一个属性 __metaclass__,其用来表示该类由 谁 、以什么形式来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

(3)、__call__:方法,调用方法class_name()(),例子如下:

复制代码
def main():
    class Dog(object):
        def __init__(self):
            self.name = 'Alex'

        def __call__(self, *args, **kwargs):
            print('in the call')

    Dog()()


if __name__ == '__main__':
    main()
View Code
复制代码

 

 

8、反射:把字符串转换成属性或方法

(1)hasattr(obj,name_str):判断obj是否有name_str方法或属性

(2)、getattr(obj,name_str):返回obj中name_str方法的内存地址或name_str属性的值

(3)、setattr(obj,name_str,fun):添加obj中的name_str方法为fun,或name_str属性为fun。

(4)、delattr(obj,name_str):删除obj中的name_str属性或方法

使用例子:

复制代码

def bulk(self):
print('%s is yelling' % self.name)


class Dog(object):

def __init__(self, name):
self.name = name

def eat(self, food):
print('%s is eating...%s' % (self.name, food))


d1 = Dog('LiZuoQi')
com_str = input(':>>')
# if hasattr(d1, com_str): # 判断d1中是否有com_str属性
# fun = getattr(d1, com_str) # 调用com_str属性
# fun('shit')
# else:
# # setattr(d1, com_str, bulk) # 设置d1中的com_str方法为bulk(已定义)
# # d1.talk(d1) # 调用上面设置好的方法
# setattr(d1, com_str, 30) # 设置d1中的com_str属性为30
# print(getattr(d1, com_str)) # 获取d1中的com_str属性
delattr(d1, com_str) # 删除d1中的com_str属性
 
复制代码

 判断当前模块是否有某函数:

复制代码
import sys


def hello(name):
    print('Hello,', name)


mod = sys.modules[__name__]
if hasattr(mod, 'hello'):
    print('有此函数')
判断某模块是否有某函数
复制代码

 

posted on   Treelight  阅读(125)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示