实例方法与静态方法

  • 实例方法:必须实例化之后才能调用,其必须有一个self参数
  • 静态方法:不需要self参数,可以直接调用的方法
class Person(object):

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

    def talk(self):
        print('我是{}, 我今年多大了'.format(self.name, self.age))  # 函数体用了self,所以这个应该定义为实例方法

    @staticmethod  # 定义为静态函数,即不需要写self参数
    def eat():
        print('我在吃饭')


p = Person('小明', 18)
p.talk()
p.eat()
"""
我是小明, 我今年多大了
我在吃饭
"""

类相关函数

  • issubclass:检测类是否为相关类的子类
class A:
    pass


class B(A):
    pass


print(issubclass(B, A))
# 输出结果
"""
True
"""
  • isinstance:检测一个对象是否为一个类的实例
class A:
    pass


a = A()
print(isinstance(a, A))
# 输出结果
"""
True
"""
  • hasattr:检测一个对象是否有具有相关属性
class A:
    name = "NoName"
    pass


a = A()
print(hasattr(a, 'name'))
print(hasattr(A, 'name'))
# 输出结果
"""
True
"""
  • getattr:获取属性
class Person(object):
    def __init__(self, name):
        self.name = name


p = Person('小明')
n = getattr(p, 'name')  # 获取实例a的name属性
print(n)
"""
小明
"""
  • setattr:设置属性
class Person(object):
    def __init__(self, name):
        self.name = name


p = Person('小明')
setattr(p, 'name', '小花')  # 获取实例a的name属性,并且赋值小花
print(p.name)
"""
小花
"""
  • delattr:删除属性
class Person(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print('我在吃饭')


p = Person('小明')
delattr(p, 'name')
print(p.name)
"""
AttributeError: 'Person' object has no attribute 'name'
"""
  • dir:列举所有属性和方法
class Person(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print('我在吃饭')


p = Person('小明')
print(dir(p))
print(dir(Person))
"""
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', 
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
  '__weakref__', 'eat', 'name']

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', 
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
 '__weakref__', 'eat']
"""

类的内置属性

  • 即类在构建的时候,类自动创建的属性
  • 该属性可以理解为来自python定义好的object类
  • __class__:获取类的名称
class Person(object):
    def __init__(self, name):
        self.name = name


p = Person('小明')
print(p.__class__)
"""
<class '__main__.Person'>
"""
  • __dict__:获取储存在类或者实例中的所有属性与方法,以字典的形式展示,从下面的结果可以看出,类的属性与方法储存在类中,实例调用的时候也还是从类那里借用而不是复制一份。
class Person(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        pass

p = Person('小明')
print(p.__dict__)
print(Person.__dict__)
"""
{'name': '小明'}
{'__module__': '__main__', '__init__': <function Person.__init__ at 0x7f972e5ad3b0>, 
'eat': <function Person.eat at 0x7f10febf2ef0>
'__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__':
 <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
"""

__doc__:查看类的说明文档

class Person(object):
    """
    我是说明文档
    """

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

    def eat(self):
        pass

p = Person('小明')
print(p.__doc__)
"""

    我是说明文档


"""

类的魔法方法

  • 魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发。
  • 魔术方法的统一特征,方法名前后两个下划线包裹

操作类

  • __init__:构造函数,对象实例化的时候自动运行
  • __call__:当对象被当成函数调用的时候自动触发
class Person:
    pass

    def __call__(self):
        """
        当把实例化对象当成函数的时候自动调用
        """
        print('恭喜你被调用了')
p = Person()
p()
"""
恭喜你被调用了
"""
  • __str__:当对象被当成字符变量直接打印的时候触发
class A:
    pass


class B:
    def __str__(self):
        print('我被当字符串变量了')
        return '我是B类'
a = A()
b = B()
print(a)
print(b)
"""
<__main__.A object at 0x7f277339c290>
我被当字符串变量了
我是B类
"""

描述类

  • __setattr__:对成员属性进行设置的时候触发
class Person(object):

    def eat(self):
        pass

    def __getattr__(self, name):
        print('没有这个东东,{}不存在'.format(name))


p = Person()
getattr(p, 'name')
"""
没有这个东东,name不存在
"""
  • __len__:成员属性进行计算长度的时候调用
class Person(object):

    def eat(self):
        pass

    def __len__(self):
        return 0  # 无论长度是多少,我都让它计算为零


p = Person()
print(len(p))
"""
0
"""
  • __del__:对象被删除的时候自动调用
class Person(object):
    def __init__(self, name):
        self.name = name

    def __del__(self):
        print('有一个元素被删除了')


p = Person('小明')
del p.name
"""
有一个元素被删除了
"""

数学运算类

  • __add__:对象之间进行加法运算的时候自动调用
class Person(object):
    def __init__(self, name):
        self.name = name

    def __add__(self, other):
        return self.name + other.name


p = Person('小明')
p2 = Person('小花')
print(p + p2)
"""
小明小花
"""
  • __sub__:对象之间做减法的时候自动调用
class Person(object):
    def __init__(self, name):
        self.name = name

    def __sub__(self, other):
        return self.name + other.name


p = Person('小明')
p2 = Person('小花')
print(p - p2)
"""
小明小花
"""
  • __mul__:对象之间做乘法的时候自动调用
class Person(object):
    def __init__(self, name):
        self.name = name

    def __mul__(self, other):
        return self.name + other.name


p = Person('小明')
p2 = Person('小花')
print(p * p2)
"""
小明小花
"""
  • __truediv__:除运算
  • __mod__:求余运算
  • __pow__:乘方运算
最后修改日期:2020年9月15日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。