object = 类名([参数…])
实例 lisi = Women() #将Women类实例化 成对象print(lisi) #<__main__.Women object at 0x000001B6873C8CC0> 三 属性和方法的使用 调用属性object.属性名
调用方法object.方法名()
注意: 类里面的变量 称之为属性 类里面的函数 称之为方法
四 self的说明方法里面的self代表的是当前类的实例化后的对象
self不是只能叫self 别的也可以 但是规范来说 都使用self
实例 class A: name = '' def demo(self): print(self) #代表当前实例化类的对象 print(id(self))a = A()a.demo()print(a)print(id(a)) 五 return 方法的返回值和函数一样 代码遇到return 下面就不在执行 会将值返回给调用处
没有return的方法 打印调用处的值为 None
实例 class Demo: name = '' def speak(self): print("我是{}号楼".format(self.name)) def myRetuen(self): return self.name print(self.name) #不在执行d2 = Demo()d2.name = 'd2' #给当前对象 添加对象属性# print(d2.name)# print(d2.speak()) #Noned2Name = d2.myRetuen()print(d2Name) #d2 六 对象属性和类属性 使用对象创建的属性 称之为对象属性 只有当前对象里才存在如果使用对象属性创建了一个和类里面同名的属性 那么调用的时候 会优先查找对象里面的属性使用类里面的方法的参数 self 创建的属性 也为对象属性当使用对象.属性名来改类里面的属性的时候 其实是在对象里面创建了一个同名的属性当将对象里面同名的属性删除掉以后 还是会调用类的属性不能再对象里 删除 类里面的属性 只有使用的权利使用类操作过的属性 所有对象在调用类属性的时候 都是修改后的属性 创建对象属性的方法 class A: #通过方法创建对象属性 def createVar(self): self.xx = 'oo'a = A()#对象名.属性名a.name = 'xx' 创建类属性的方法 类名.属性名 七 给对象和类绑定方法 (1)给对象绑定方法from types import MethodType
实例 def func(self): print('func')from types import MethodTypea = A()#a.func = MethodType(方法名,对象名)a.func = MethodType(func,a) (2) 给类绑定方法 实例 def func(self): print('func')#类名.属性名 = 函数名A.func = func 注意: 给对象绑定属性或者方法 只有当前对象有给类绑定属性或者方法 所有当前类的实例化的对象 都会拥有 八 __slots__ 限制对象 动态添加属性只能创建__slots__允许的属性 否则会报 AttributeError: ‘A’ object has no attribute ‘xxx’
实例: class A: __slots__ = ('属性1','属性2'...) 九 私有属性 和 私有方法(1) 类的私有属性:以__ 作为开头 不能再类的外部进行使用和访问 在类的里面使用 self.__属性名
私有属性的访问在类的外部: 对象._类名__属性名 查找
在类的内部: 方法里面的变量 self.__属性名 调用
注意: 在类的内部只要使用self.__属性名 那么就会去找私有属性_类名___属性名(2) 类的私有方法
以__ 作为开头 不能再类的外部进行使用和访问 在类的里面使用 self.__方法名
在公有方法里面 通过self去调用
十 继承概念: 面向对象编程带来最大的好处就代码的重用 实现代码重用的操作就是累的继承
被继承的类称之为 父类、基类 或超类
继承的类称之为子类
所有的类都会继承一个超类 object
(1) 单一继承class 类名(继承的父类):
pass
实例 class A: #不管是本类还是子类 只要实例化 就会调用(前提是 没有被子类的__init__覆盖) def __init__(self,n,a,s): self.name = n self.age = a self.sex = s def speak(self): print("我现在{}岁了 我叫{} 我的性别是{}".format(self.age,self.name,self.sex))# a = A('ljdxm',18,'男')# print(a.name)# a.speak()class B(A): grade = '' def __init__(self,name,age,sex,grade): print('我是子类的__init__') self.grade = grade A.__init__(self,name,age,sex) def speak(self): A.speak(self) print("我今年{} 我叫{} 我的成绩是{}".format(self.age,self.name,self.grade))b = B('ljdxm',18,'男',60)# print(b.name)# print(b.__dict__)b.speak() 注意 类的单一继承 子类会继承父类私有以外的全部属性和方法如果在子类里存在和父类同名的属性或者方法 叫做方法或属性的重写(也就是会覆盖掉)再次调用的时候 调用的是 子类的方法和属性在子类里调用父类的方法 类名.方法名(self[,参数…]) self代表当前类的实例化的对象super(当前类名,self).方法名(如果是单一继承 super方法 不建议加参数)super().方法名(建议) (2) 多继承class 类名(继承的父类1,继承的父类2[,父类3..]):
pass
注意:
当类进行多继承的时候 注意父类的顺序 当父类存在同名的属性或者方法的时候 会从继承的父类从左->右依次查找 调用父类的方法 class A: def speak(self): print('我是A类的speak方法') def a(self): print('a')class B: def speak(self): print('我是B类的speak方法') def b(self): print('b')class C(A,B): def speak(self): super().speak() #还是从左往右找.. #super(C,self).speak() # super(A,self).speak() # super(B,self).speak() 十一 常用的属性 __doc__ 类的说明__name__返回类名__base__ 返回一个父类__bases__ 返回多个父类__dict__ 返回对象或者类的信息 十二 静态方法@staticmethod
可以在类的实例化成对象来调用 可以使用类名来调用
实例 class A: @staticmethod def demo(): print('类来调用')a = A()a.demo()A.demo() 十三 魔术方法 __init__ 构造方法 作为类的初始化__del__ 析构方法 在当前文件执行完毕之前去执行 或者是使用 del 对象名 去触发__str__ 用于转换成 人类能够阅读的形式 __repr__ 转换成解释器查看的形式__add__ 运算符重载__getattr__ 调用不存在的属性的时候触发__len__ __getitem____setitem__