← 返回首页
Python3基础教程(四十)
发表时间:2022-04-09 10:53:46
定制类

1.定制类

以两个下划线开头和结尾的方法都属于类的专用方法,当然我们也可以重写这些方法,实现定制类的功能。

例如:

# -*- coding: utf-8 -*-
# @Time : 2022/4/9 10:35
# @File : defineclass.py
# @Software : PyCharm

class Person(object):
    def __init__(self, name, gender, age):
        self._name = name
        self._gender = gender
        self._age = age;


p = Person('张三', '男', 20)
print(p)

运行结果:

<__main__.Person object at 0x00000120D9CB3A00>

打印出一堆<main.Person object at 0x00000120D9CB3A00>类似对象的hash码,不好看。

重写__str__方法后。

# -*- coding: utf-8 -*-
# @Time : 2022/4/9 10:35
# @File : defineclass.py
# @Software : PyCharm

class Person(object):
    def __init__(self, name, gender, age):
        self._name = name
        self._gender = gender
        self._age = age;

    def __str__(self):
        return 'The person name is:%s,gender is:%s,age is:%s' % (self._name, self._gender, self._age)


p = Person('张三', '男', 20)
print(p)

运行结果:

The person name is:张三,gender is:男,age is:20

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用obj.method()来调用。在Python中,任何类只需要定义一个__call__()方法,就可以直接对实例进行调用。

例如:

# -*- coding: utf-8 -*-
# @Time : 2022/4/9 10:35
# @File : defineclass.py
# @Software : PyCharm

class Person(object):
    def __init__(self, name, gender, age):
        self._name = name
        self._gender = gender
        self._age = age;

    def __str__(self):
        return 'The person name is:%s,gender is:%s,age is:%s' % (self._name, self._gender, self._age)

    def __call__(self):
        print('Hello, My name is %s. I am %s years old!' % (self._name, self._age))


p = Person('张三', '男', 20)
print(p)
p() # self参数不要传入

运行结果:

The person name is:张三,gender is:男,age is:20
Hello, My name is 张三. I am 20 years old!

怎么如何一个变量是对象还是函数呢?python提供了Callable函数用来判断当前变量是否是可调用的。


class Animal(object):
    pass

class Person(object):
    def __init__(self, name, gender, age):
        self._name = name
        self._gender = gender
        self._age = age;

    def __str__(self):
        return 'The person name is:%s,gender is:%s,age is:%s' % (self._name, self._gender, self._age)

    def __call__(self):
        print('Hello, My name is %s. I am %s years old!' % (self._name, self._age))


p = Person('张三', '男', 20)
print(p)
p()

a = Animal()
print(callable(p))
print(callable(a))

运行结果:

The person name is:张三,gender is:男,age is:20
Hello, My name is 张三. I am 20 years old!
True
False