python面向对象编程
一、self对象
class Person: def __init__(self,x,y): self.name=x self.age=y p1=Person('Jack',19)
当创建了一个实例对象p1时,Python底层会进行如下操作
2、调用__init__方法传入参数,将self指向创建好的内存空间,填充数据
动态属性
1、p1.city='Beijing'
给对象属性赋值,如果这个属性以前不存在(__init__方法没定义),会给对象添加一个新的属性。
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
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
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__不需要返回值
单例
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的类我们称之为新式类
在python3里,不手动制定父类object,也是默认继承自object,在python中都是新式类。