类和对象
所有的数据类型都被视为对象,也可以自定义对象,自定义对象数据类型就是面向对象中的类的概念
类:用来描述具有相同属性和方法的对象的集合,类定义了集合中每个对象共有的属性和方法。
对象:对象是类的实例。
面向对象基本语法
定义一个简单的类
class 类名(父类):
pass
class Person(object): #object是所有类的直接或间接父类
def run(self):
print('正在跑步')
实例对象
对象变量名 = 类名()
self
class Person(object):
def __init__(self,name):
self.name = name #谁调用了这个方法,这个self就是指向了谁
p1 = Person('zhangsan')
魔术方法
Python 的类里提供的,两个下划线开始,两个下划线结束的方法,就是魔法方法,魔法方法在恰当的时候就会被激活,自动执行
__ init __ 初始化方法
对象在初始化的时候自动执行
class Cat:
"""这是一个猫类"""
def __init__(self,name): # 重写了 __init__ 魔法方法
self.name = name
def eat(self):
return "%s爱吃鱼"%self.name
def drink(self):
return '%s爱喝水'%self.name
"""
tom = Cat()
TypeError: __init__() missing 1 required positional argument: 'name'
这种写法在运行时会直接报错!因为 __init__ 方法里要求在创建对象时,必须要传递 name 属性,如果不传入会直接报错!
"""
tom = Cat("Tom") # 创建对象时,必须要指定name属性的值
tom.eat() # tom爱吃鱼
__ str __ 返回对象的描述信息
在用print打印对象的时候自动调用
class Cat(object):
"""这是一个猫类"""
def __init__(self,name):
self.name = name
def __str__(self):
return '正在打印这个类'
c = cat('小猫') # 创建一个对象c
print(c) # 自动调用__str__这个方法 结果==> 正在打印这个类
__ repr__ 这个方法作用和__ str __ 一样,不过两个都存在时,优先执行__ str __
__ del __删除对象
当删除对象时,python解释器也会默认调用一个方法
class Cat(object):
"""这是一个猫类"""
def __init__(self,name):
self.name = name
def __str__(self):
return '正在打印这个类'
def __del__(self):
print('这个方法被调用了')
c = cat('小猫') # 创建一个对象c
del c # 执行这个语句时,自动调用__del__这个方法 结果==> 这个方法被调用了
对象之间进行运算时自动执行的魔术方法
__ eq__ 计算==时执行
__ gt__ 计算>时执行
__ lt__ 计算<时执行
__ ge__ 计算>=时执行
__ le__ 计算<=时执行
例子如下:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __gt__(self, other):
return self.age > other.age
def __str__(self):
return '{}'.format(self.age)
#创建5个对象
p1 = Person('zhang', 19)
p2 = Person('lisi', 20)
p3 = Person('liu', 18)
p4 = Person('wang', 18)
p5 = Person('huas', 21)
persons = [p1, p2, p3, p4, p5]
persons.sort() #将列表进行排序,在比较时,会自动调用__gt__这个方法利用对象的age属性进行比较
print(persons)
__ call__ 当实例对象像函数一样被调用时自动调用
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __call__(self, *args, **kwargs):
print('我被调用了')
p = Person('zhangsan',14) #实例化对象
p() #把实例化对象当做函数来调用,这个时候会自动调用__call__方法
>>>>>> 我被调用了