python类的详解
- 类与对象
- python类的创建与实例化过程
- 实例化与初始化
- 私有属性与私有方法
- 类的描述__str__,帮助文档__doc__
- 几个常用的装饰器
- 对象的删除
- 可迭代类
- 对象的比较
类与对象
类(class)和对象(object)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。
它们的关系是:对象是类的实例,类是对象的模板。对象是通过new classname产生的,用来调用类的方法;类的构造方法 。类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。(来自百度百科)
python类的创建与实例化过程
首先,前文说过类是对象的抽象,故在python中,类的使用顺序一般都是:创建一个类->实例化类->绑定类属性->其他操作(如调用类的方法)
创建类很简单,只需:
class Animal:
pass
即可创建一个Animal类。然后通过调用__new__实例化类,在通过调用__init__,绑定类属性(可以认为是类属性 的初始化)。下面将给出一个Animal类,类中包含各种基础的方法。
class Animal(object):
'Animal,的帮助文档,__doc__'
# 实例化类时调用
# 创建对象前调用
# 必须要将cls返回回去,cls
def __new__(cls, *args, **kwargs):
print('创建对象,类名称:', cls.__name__)
return object.__new__(cls)
# 初始化方法
# 创建完对象后会自动被调用
def __init__(self, name):
print(f'创建{name}对象')
self.__name = name #在变量或函数前加__,就是私有变量。只能在类中使用。
self.name = name
self.__num = 0
# def __slots__(self):
# # 限制实例动态属性,减少内存消耗
# # tuple类型
# pass
def __hash__(self):
print( f'{self.__name}使用了hash函数')
return hash(self.__name)
def __eq__(self, other):
print(f'{self.__name}使用了__eq__函数')
# self.__dict__['_Animal__name'] = self.__dict__['_Animal__name']+',手动修改'
if isinstance(other, self.__class__):
return self.__dict__ == other.__dict__
else:
return False
def __str__(self):
"""返回一个对象的描述信息"""
# print(num)
return f"该对象名称是{self.__name},__str__"
def __call__(self, name):
return self.attr_animals(name)
def __iter__(self):
# 创建一个迭代器
return self
def __next__(self):
# 有该方法,则该类为可迭代的类,即可以使用for...in...
# 循环过程
# 迭代时可以没有__iter__,但是必须有该方法。
self.__num = self.__num + 1
print(self.__num)
return self.__num
def attr_animals(self, name):
print(f'{name}是狗狗的一种')
# @staticmethod创建工具集,不需要实例化对象,第一个参数无需传对象本身
@staticmethod
def action_animals(name):
print(f'{name}正在觅食')
# @classmethod 第一个参数为类本身,通过新的方式构造实例,类似于重载
@classmethod
def method_animals(cls,name):
print(f'{name}正在奔跑')
# return cls(name)
# 变方法为属性
@property
def obj_type(self):
return '动物'
@property
def obj_name(self):
return self.name
# 析构方法
# 当对象被删除时,会自动被调用
def __del__(self):
# print("__del__方法被调用")
print("%s对象马上被干掉了..." % self.__name)
def __eat_foot(self):
# 双下划线'__'开头,表示该方法是私有方法,只能在类内调用,其他地方均不可调用。
print(f'{self.__name}正在进食,私有方法')
def eat_foot(self):
# 双下划线'__'开头,表示该方法是私有方法,只能在类内调用,其他地方均不可调用。
print(f'{self.__name}正在进食,公有方法')
实例化与初始化
当实例化类时,首先执行__new__方法,将类实例化一个对象,然后通过__init__方法,绑定对象属性(也可以称之为初始化):
很明显,当执行Animal(‘藏獒’) 时,将Animal类实例化为了一个名字(__name)叫藏獒的对象。
私有属性与私有方法
其中在变量前加双下划线表示该属性(变量)为私有属性只可以在类内使用与修改,其他地方不可使用,否则该属性为共有属性,任何地方都可以使用与修改;私有方法同理:
类的描述__str__,帮助文档__doc__
当类中有__str__方法时,使用print函数打印该类实例化的对象,则会调用该方法。
否则print出的结果将是:<main.Animal object at …>。
使用__doc__将会输出类下面的字符串:
几个常用的装饰器
python中一@开头的一般称之为装饰器,用来装饰方法的,在类中常用的装饰器有:
- @property,该装饰器可以将方法变为属性,一般用于创建只读属性。
- @staticmethod创建工具集,不需要实例化对象,第一个参数无需传对象本身
- @classmethod 第一个参数为类本身,通过新的方式构造实例,类似于重载,它与staticmethod使用十分相似,但是他的实现与staticmethod不同,它的第一各个参数是类本身,如果将类return回去将会实例化对象。
对象的删除
创建提个对象后,如果要删除该对象则会调用__del__方法。
可迭代类
可迭代即可以使用for…in…,当类中有__next__方法时,则可以使用之:
对象的比较
对象比较调用的是__eq__方法。