1. class Person:
  2. name = '小明' # 定义类属性
  3. age = 20
  4. def eat(self): # 定义类方法
  5. print("正在吃饭")
  6. def run(self):
  7. print("正在跑步")
  8. p = Person()
  9. p.run()
  10. p.eat()
  11. print("{},今年{}岁,大口吃饭".format(p.name, p.age))

类的实例

  1. #类里面用def定义的函数就是实例方法
  2. class test:
  3. def run(self): # 这里的self是占位的意思,可以任意字符
  4. print("好好吃饭")
  5. t = test()
  6. t.run()

类属性

class类里面设置的变量即为类属性

实例属性

在类的实例中定义的变量,例:self.name=”实例属性”

实例中初始化方法

  1. #在实例初始化的时候自动调用的
  2. class Person:
  3. def __init__(self): #定义初始化方法
  4. self.name="大黄" #类中的全局实例属性
  5. self.color="yellow"
  6. p = Person()
  7. print(p.name,p.color)
  8. #自定义传参
  9. class Person:
  10. def __init__(self,name,color): #定义初始化方法
  11. self.name=name #类中的全局实例属性
  12. self.color=color
  13. p = Person("大黄","yellow")
  14. print(p.name,p.color)

self 相当于实例本身在实例化的时候自动调用实例本身

self 和对象指向的内存地址是同一个

self 只有在类中定义 实例方法才有意义

self 的名字可以任意更改

常见的魔术方法

面向对象 - 图1

继承

将多个类中共有的方法,提取到一个父类里面,子类调用父类就叫继承

单继承

  1. class all():
  2. def eat(self):
  3. print("吃饭")
  4. def sleep(self):
  5. print("睡觉")
  6. class cat(all):
  7. def mmj(self):
  8. print("小猫叫了")
  9. class dog(all):
  10. def wwj(self):
  11. print("小狗叫了")
  12. cat = cat()
  13. dog = dog()
  14. print("*"*40+"小狗")
  15. dog.wwj()
  16. dog.eat()
  17. dog.sleep()
  18. print("*"*40+"小猫")
  19. cat.mmj()
  20. cat.eat()
  21. cat.sleep()

多继承

多继承从左到右依次查找,先找平级,再找二级

  1. class D:
  2. def eat(self):
  3. print("this is D")
  4. class C(D):
  5. def eat(self):
  6. print("this is C")
  7. class B(D):
  8. pass
  9. class A(B,C):
  10. pass
  11. a = A()
  12. a.eat()
  13. print(A.__mro__) #查看继承传递过程
  14. # 结果:this is C
  15. # 顺序是:(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)

重写和调用父类

在子类中弄一个和父类一样的方法,及达到重写的目的

  1. class f():
  2. def __init__(self,name,color):
  3. print("%s狗是%s"%(name,color))
  4. def bark(self):
  5. print("父类大狗汪汪叫")
  6. class z(f):
  7. def __init__(self,name,color): #重写父类
  8. f.__init__(self,name,color) #调用父类方法
  9. def bark(self):
  10. print("子类小狗嗷呜嗷呜叫")
  11. z=z("柯基","白色")
  12. z.bark()

多态

面向对象 - 图2

类方法

@classmethod 修饰的实例方法 第一个参数是cls

静态方法

@staticmethod 修饰的实例方法 不需要定义参数

静态方法不会涉及类中的方法和属性操作

导入

私有化属性

私有化属性只能在内部使用

私有化属性也不能被继承

  1. class Person():
  2. def __init__(self):
  3. self.__name="李四" #__关键字 私有化方式
  4. self.age=18

私有化方法

在方法名前边加上 __ 跟私有化属性效果一样

property 属性函数用于访问私有类

单例模式

确保某一个类只有一个实例存在

  1. class database():
  2. def __new__(cls,*args,**kwargs):
  3. # cls._instance=cls.__new__(cls) 如果使用自身new方法就会造成死循环
  4. if not hasattr(cls, '_instance'):
  5. cls._instance = super().__new__(cls,*args,**kwargs)
  6. return cls._instance
  7. d1=database()
  8. d2=database()
  9. print(id(d1),id(d2))

异常处理

  1. try:
  2. 可能会报错的语句
  3. except 错误类型 (as 别名):
  4. 如果出错要执行的语句
  5. else:
  6. 若没有出错执行的语句
  7. finally
  8. 无论是否出错都要执行的语句
  9. #------------------------------------------例子
  10. try:
  11. print(b)
  12. except Exception as msg: #万能错误类型
  13. print(msg)

动态添加属性方法

types库 用于实例类添加属性

  1. #只有实例对象才需要types库 其他的对象直接添加
  2. import types
  3. def run(self):
  4. self.name="李四"
  5. self.go="跑步"
  6. print("{}在{},遇见了一只{}岁的小{}猫".format(self.name,self.go,cat.age,cat.color))
  7. class cat():
  8. def __init__(self):
  9. self.age=2
  10. self.color="红"
  11. cat=cat()
  12. cat.run=types.MethodType(run,cat)
  13. #其他对象添加方式
  14. #cat.run=run
  15. cat.run()

slots 用于限定类中所能用的变量属性

slots限定以后类对象存储将不再是dict字典类型,节约内存速度更快

  1. # slots 限定属性不会传递给子类 但子类如果定义了 则子类的限定值=父类的限定+子类的限定
  2. class cat():
  3. __slots__=("name","age") #这里限定了cat类中只能用name,age两个变量属性
  4. def __str__(self):
  5. return("{}........{}".format(self.name,self.age))
  6. cat=cat()
  7. cat.name="李四"
  8. cat.age=20
  9. print(cat)
  10. cat.eat="榴莲"
  11. print(cat)