python面向对象编程4(self对象、对象内置函数、单例、新式类和经典类)
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中都是新式类。

浙公网安备 33010602011771号