1. 面向对象
1. 定义类
- 语法
# 类名要满足命名规则,遵循大驼峰命名规范 class 类名(): 代码
2. 创建对象
- 语法
对象名 = 类名()
- 示例
class Number(): def GetName(self): print("ccblogs") nb1 = Number() nb1.GetName() # 输出结果 ccblogs
3. self
- self:调用该函数的对象
class Number(): def GetName(self): print(self) nb1 = Number() print(nb1) nb1.GetName() # 输出结果 <__main__.Number object at 0x7f40a2c09640> <__main__.Number object at 0x7f40a2c09640>
- 一个类可以创建多个对象
class Number(): def GetName(self): print(self) nb1 = Number() print(nb1) nb1.GetName() print("*" * 20) nb2 = Number() print(nb2) nb2.GetName() # 输出结果 <__main__.Number object at 0x7fe1764b5640> <__main__.Number object at 0x7fe1764b5640> ******************** <__main__.Number object at 0x7fe1764a15b0> <__main__.Number object at 0x7fe1764a15b0>
4. 添加和获取对象属性
- 类外面添加对象属性
对象名.属性名 = 值
- 类外面获取对象属性
class Number(): def GetName(self): print(self) nb1 = Number() nb1.age = 18 print(nb1.age) # 输出结果 18
- 类里面获取对象
# 语法 self.属性名
# 示例 class Number(): def GetName(self): print(self.name) nb1 = Number() nb1.name = "ccblogs" nb1.GetName() # 输出结果 ccblogs
5. 魔法方法
- __init__():初始化对象
# 不带参数 class Nb1(): def __init__(self): self.name = "ccblogs" self.age = 18 def print_nb(self): print(f"Name:{self.name}, Age:{self.age}") nb1 = Nb1() nb1.print_nb() # 带参数 class Nb2(): def __init__(self, name, age): self.name = name self.age = age def print_nb(self): print(f"Name:{self.name}, Age:{self.age}") nb2 = Nb2("ccblogs", 19) nb2.print_nb() # 输出结果 Name:ccblogs, Age:18 Name:ccblogs, Age:19
- __str__():打印类的对象时,返回这个方法的return值。可以设置类的说明
class Nb(): def __str__(self): return "这是一个返回成员信息的类" nb = Nb() print(nb) # 输出结果 这是一个返回成员信息的类
- __del__():删除类对象时,默认执行该方法
class Nb(): def __del__(self): print("del方法") nb = Nb() del nb # 输出结果 del方法
6. 继承
- 经典类:不由任意内置类型派生出的类
class 类名: 代码
- 新式类
class 类名(object): 代码
- 继承的概念
- Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法。
- Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。
class Nb(object): def __init__(self): self.name = "ccblogs" def getName(self): print(self.name) class Cb(Nb): pass cc = Cb() cc.getName() # 输出结果 ccblogs
- 单继承
class Nb(object): def __init__(self): self.name = "ccblogs" def getName(self): print(self.name) class Cb(Nb): pass cc = Cb() print(cc.name) cc.getName() # 输出结果 ccblogs ccblogs
- 多继承
# 当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。 class Nb1(object): def __init__(self): self.name = "ccblogs1" def get_name(self): print(self.name) class Nb2(object): def __init__(self): self.name = "ccblogs2" def get_name(self): print(self.name) class Cb(Nb2, Nb1): pass cc = Cb() print(cc.name) cc.get_name() # 输出结果 ccblogs2 ccblogs2
- 重写
class Nb1(object): def __init__(self): self.name = "ccblogs1" def get_name(self): print(self.name) class Nb2(object): def __init__(self): self.name = "ccblogs2" def get_name(self): print(self.name) class Cb(Nb2, Nb1): def __init__(self): self.name = "ccblogs3" def get_name(self): print(self.name) cc = Cb() print(cc.name) cc.get_name() # 输出结果 ccblogs3 ccblogs3
- 查看父类层级关系
class Nb1(object): def __init__(self): self.name = "ccblogs1" def get_name(self): print(self.name) class Nb2(object): def __init__(self): self.name = "ccblogs2" def get_name(self): print(self.name) class Cb(Nb2, Nb1): def __init__(self): self.name = "ccblogs3" def get_name(self): print(self.name) print(Cb.__mro__) # 输出结果 # (<class '__main__.Cb'>, <class '__main__.Nb2'>, <class '__main__.Nb1'>, <class 'object'>)
- 子类调用父类同名属性和方法
class Nb1(object): def __init__(self): self.name = "ccblogs1" def get_name(self): print(self.name) class Nb2(object): def __init__(self): self.name = "ccblogs2" def get_name(self): print(self.name) class Cb(Nb2, Nb1): def __init__(self): self.name = "ccblogs3" def get_name(self): self.__init__() print(self.name) def nb1_get_name(self): # 同名方法中使用了同名属性,所以需要调用下父类的init方法 Nb1.__init__(self) Nb1.get_name(self) def nb2_get_name(self): Nb2.__init__(self) Nb2.get_name(self) cb = Cb() cb.get_name() cb.nb1_get_name() cb.nb2_get_name() cb.get_name() # 输出结果 ccblogs3 ccblogs1 ccblogs2 ccblogs3
- 多层继承
class Nb1(object): def __init__(self): self.name = "ccblogs1" def get_name(self): print(self.name) class Nb2(object): def __init__(self): self.name = "ccblogs2" def get_name(self): print(self.name) class Cb(Nb2, Nb1): def __init__(self): self.name = "ccblogs3" def get_name(self): self.__init__() print(self.name) def nb1_get_name(self): # 同名方法中使用了同名属性,所以需要调用下父类的init方法 Nb1.__init__(self) Nb1.get_name(self) def nb2_get_name(self): Nb2.__init__(self) Nb2.get_name(self) class Mb(Cb): pass mb = Mb() mb.get_name() mb.nb1_get_name() mb.nb2_get_name() mb.get_name() # 输出结果 ccblogs3 ccblogs1 ccblogs2 ccblogs3
- super()
# 使用super()可以自动查找父类。调用顺序遵循__mro__类属性的顺序。比较适合单继承使用。 class Nb1(object): def __init__(self): self.name = "ccblogs1" def get_name(self): print(self.name) class Nb2(Nb1): def __init__(self): self.name = "ccblogs2" def get_name(self): print(self.name) super().__init__() super().get_name() class Cb(Nb2): def __init__(self): self.name = "ccblogs3" def get_name(self): self.__init__() print(self.name) def nb2_get_name(self): # super(Cb, self).__init__() # super(Cb, self).get_name() # 也可以是下面的写法 super().__init__() super().get_name() class Mb(Cb): pass mb = Mb() mb.get_name() mb.nb2_get_name() mb.get_name() # 输出结果 ccblogs3 ccblogs2 ccblogs1 ccblogs3
7. 私有权限
- 定义私有属性和方法
# 为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。 # 设置私有权限的方法:在属性名和方法名前面加上两个下划线__ class Nb1(object): def __init__(self): self.name = "ccblogs1" self.__pwd = "123456" def get_name(self): print(self.name) def __get_pwd(self): print(self.__pwd) class Nb2(Nb1): pass nb = Nb2() # nb无法调用Nb1里面的__pwd属性和__get_pwd()方法
- 获取和修改私有属性
class Nb1(object): def __init__(self): self.name = "ccblogs1" self.__pwd = "123456" def get_name(self): print(self.name) def __get_pwd(self): print(self.__pwd) def set_pwd(self): self.__pwd = "000000" def get_pwd(self): return self.__pwd class Nb2(Nb1): pass nb = Nb2() print(nb.get_pwd()) nb.set_pwd() print(nb.get_pwd()) # 输出结果 123456 000000