面向对象进阶

一、静态方法:

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

使用方法:@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('有此函数')
判断某模块是否有某函数

 

转载于:https://www.cnblogs.com/Treelight/p/10771799.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值