类:用来描述具有相同属性和方法的对象的集合
一 类的命名方式
- 大驼峰 首字母大写
- 见名之意
- 区分大小写
实例
class Women:
sex = '女'
faceValue = "高"
height = "168"
weight = "85斤"
color = "yellow"
def makeChild(self):
print("可以生宝宝")
def cookie(self):
print("做饭")
def memeda(self):
print("白天么么哒")
#打印Women 类
print(Women) #<class '__main__.Women'>
二 对象
类的实例化为对象
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()) #None
d2Name = 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 MethodType
a = 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('张三',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('张三',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__