类(class)和对象(object)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。
它们的关系是:对象是类的实例,类是对象的模板。对象是通过new classname产生的,用来调用类的方法;类的构造方法 。类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。(来自百度百科)
首先,前文说过类是对象的抽象,故在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__方法,绑定对象属性(也可以称之为初始化):
其中在变量前加双下划线表示该属性(变量)为私有属性只可以在类内使用与修改,其他地方不可使用,否则该属性为共有属性,任何地方都可以使用与修改;私有方法同理:
当类中有__str__方法时,使用print函数打印该类实例化的对象,则会调用该方法。
使用__doc__将会输出类下面的字符串:
几个常用的装饰器
python中一@开头的一般称之为装饰器,用来装饰方法的,在类中常用的装饰器有:
@property,该装饰器可以将方法变为属性,一般用于创建只读属性。
@staticmethod创建工具集,不需要实例化对象,第一个参数无需传对象本身
@classmethod 第一个参数为类本身,通过新的方式构造实例,类似于重载,它与staticmethod使用十分相似,但是他的实现与staticmethod不同,它的第一各个参数是类本身,如果将类return回去将会实例化对象。
对象的删除创建提个对象后,如果要删除该对象则会调用__del__方法。
可迭代类
可迭代即可以使用for…in…,当类中有__next__方法时,则可以使用之:
对象比较调用的是__eq__方法。
以上是内存溢出为你收集整理的python的类与对象全部内容,希望文章能够帮你解决python的类与对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)