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