python面向对象编程
一、self对象
class Person:
def __init__(self,x,y):
self.name=x
self.age=y
p1=Person('Jack',19)
当创建了一个实例对象p1时,Python底层会进行如下操作
1、调用__new__方法,用来申请内存空间
2、调用__init__方法传入参数,将self指向创建好的内存空间,填充数据
3、变量p1也指向创建好的内存空间
动态属性
1、p1.city='Beijing'
给对象属性赋值,如果这个属性以前不存在(__init__方法没定义),会给对象添加一个新的属性。
2、p1.name='Rose'
给对象属性赋值,如果这个属性类中存在,则会修改对象所对应属性的值。
3、如果要限制类中的属性,可以使用__slots__(属性名)来限制,在类中直接定义,格式:
class Person:
__slots__=('name','age') #用来规定对象可以存在的属性
def __init__(self,x,y):
self.name=x
self.age=y
其他属性就不能再动态定义了。
二、对象内置函数
python中的身份运算符用来判断两个对象是否相等;isinstance用来判断对象和类之间的关系;issubclass用来判断类和类之间的关系。
1、身份运算符
身份运输符用来比较两个对象的内存地址,看这两个对象是否是同一个对象。
class Person(object):
def __init__(self,name):
self.name=name
p1=Person('Jack')
p2=Person('Jack')
p3=p1
print(p1 is p2) #False
print(pi is p3) #True
2、isinstance
isinstance内置函数,用来判断一个实例对象是否是由某一个类(或者子类)实例化创建出来的。
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
class Student(Person):
def __init__(self,name,age,score):
super(Student,self).__init__(name,age) #继承父类的name,age初始化
self.score=scroe
class Dog:
def __init__(self,name,color):
self.name=name
self.color=color
p=Person('Jack',18)
s=Student('Rose',20,98)
d=Dog('mimi','white')
print(isinstance(p,Person)) #True 对象p是由Person类创建出来的
print(isinstance(s,Person)) #True 对象s是由Person类的子类创建出来的
print(isinstance(d,Person)) #True 对象d和Person类没有关系
3、issubclass
issubclass用来判断两个类之间的继承关系。
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
class Student(Person):
def __init__(self,name,age,score):
super(Student,self).__init__(name,age) #继承父类的name,age初始化
self.score=scroe
class Dog:
def __init__(self,name,color):
self.name=name
self.color=color
print(issubclass(Student,Person)) #True
print(issubclass(Dog,Person)) #False
三、单例
__new__ 和 __init__方法
class A:
def __init__(self):
print('这是init方法')
def __new__(cls):
print('这是new方法')
return object.__new__(cls)
A()
总结:
1、__new__至少需要一个参数cls,代表要实例化的类,此参数在实例化时由python解释器自动提供
2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
3、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成其它初始化的动作,__init__不需要返回值
单例
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
class Singleton:
__instance=None
__is_first=True
@classmethod
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
#申请内存,创建一个对象,并把对象的类型设置成cls
cls.__instance=object.__new__(cls)
return cls.__instance
def __init__(self,a,b):
if self.__is_first: #保留第一次初始化数据
self.a=a
self.b=b
self.__is_first=False
s1=Singleton('hello','world')
s2=Singleton('you','welcome')
print(s1.a, s2.a, s1.b, s2.b) #hello hello world world
四、新式类和经典类
新式类:继承自object的类我们称之为新式类
经典类:不继承自object的类
在python2里,如果不手动的制定一个父类是object,这个类就是一个经典类。
在python3里,不手动制定父类object,也是默认继承自object,在python中都是新式类。
在python2里,继承自object,意味着有更多的内置函数和方法可调用。