1.属性和方法
• 属性 • 类属性,直接在类中定义的属性是类属性 • 类属性可以通过类或类的实例访问到。但是类属性只能通过类对象来修改,无法通过实例对象修改 • 实例属性 通过实例对象添加的属性属于实例属性 • 实例属性只能通过实例对象来访问和修改,类对象无法访问修改 • 方法 • 在类中定义,以self为第一个参数的方法都是实例方法 • 实例方法在调用时,Python会将调用对象以self传入 • 实例方法可以通过类实例和类去调用 • 当通过实例调用时,会自动将当前调用对象作为self传入 • 当通过类调用时,不会自动传递self,我们必须手动传递self • 类方法 在类的内容以@classmethod 来修饰的方法属性类方法 • 类方法第一个参数是cls 也会自动被传递。cls就是当前的类对象 • 类方法和实例方法的区别,实例方法的第一个参数是self,类方法的第一个参数是cls • 类方法可以通过类去调用,也可以通过实例调用 • 静态方法 • 在类中用@staticmethod来修饰的方法属于静态方法 • 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用 • 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数 • 静态方法一般都是些工具方法,和当前类无关
# 类属性 class A(object): # 类属性:直接定义在类中的属性 # 类属性可以通过类和该类的实例来访问 # 类中的属性只能通过类对象来修改,不能通过实例对象来修改 # count = 0 # init方法里面的属性是实例属性,只能实例对象调用,这个取决于我们的self def __init__(self): self.name = '奥特曼' # 这个是实例方法 带了self的都是存储在实例中的 # 如果类要调用实例方法,需要传递实例进去 A.test(a) def test(self): print('这是test方法') # 类方法需要用classmethod装饰器修饰,这个方法有一个参数,就是cls,值得就是类对象本身 # 类方法 类可以直接调用,实例同样可以直接调用 @classmethod def test1(cls): print('这是test1方法') # 静态方法: 类和实例都可以直接调用 # 静态方法不需要制定任何默认的参数,它和类本身无关,就是一个功能函数 @staticmethod def test2(a): print(a) print('这是test2方法') a = A() # a.count = 10 # 实例属性: 实例属性就是通过实例对象来添加的属性 # 实例属性只能由实例来调用,不能由类对象来调用 # a.count = 20 # print('A', A.name) # print('a', a.name) # A.test(a) # A.test2() a.test2(1)2.__new__方法 魔法方法 new()方法用于创建与返回一个对象。在类准备将自身实例化时调用。
#__new__方法 魔法方法 class Deom(object): def __init__(self): print('__init__') def __new__(cls, *args, **kwargs): #相当于覆盖了父类的new方法 print('__new__') # return super().__new__(cls) b = Deom() #结果 __new__ # __new__方法 魔法方法 class A(): pass class Deom(A): def __init__(self, name, age): print('__init__') def __new__(cls, *args, **kwargs): print("__new__") return super().__new__(cls) d = Deom('奥特曼', 18) print(d) #结果 __new__ __init__ <__main__.Deom object at 0x00000263E0998940>3.单例模式 单例模式介绍 单例模式是一种常用的软件设计模式。也就是说该类只包含一个实例。 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 通常应用在一些资源管理器中,比如日志记录等。
单例模式实现 思路 • 当对象不存在时,创建对象 • 当对象存在时,永远返回当前已经创建对象
class single(object): __isinstance = None def __new__(cls, *args, **kwargs): if cls.__isinstance is None: cls.__isinstance = super().__new__(cls) return cls.__isinstance else: return cls.__isinstance a = single() b = single() print(id(a)) print(id(b)) #结果 2618470465888 26184704658884. 模块 • 模块化指将一个完整的程序分解成一个个的小模块 • 通过将模块组合,来搭建出一个完整的程序 • 模块化的有点 • 方便开发 • 方便维护 • 模块可以复用 2. 模块的创建 • 在Python当中一个py文件就是一个模块 • 在一个模块中引入外部模块 import 模块名(模块名就是py文件) • 可以引入同一个模块多次,但是模块的实例只会创建一次 • import 模块名 as 模块别名 • 在一个模块内部都有一个__name__。通过它我们可以获取模块的名字 • 如果py文件直接运行时,那么__name__默认等于字符串’main’。__name__属性值为__main__的模块是主模块。一个程序中只有一个主模块
属性总结: 在实际开发中,如果属性的值是固定的,不随对象的改变而改变。那就使用静态属性(类属性),这样有利于节省内存的消耗。而如果属性的值随对象的改变而改变,就使用实例属性。
类方法:
class Demo: def __init__(self): self.name = "hlll" # 实例方法:通常用于需要使用实例属性 def test_one(self): #print(self) print(self.name) d = Demo() d.test_one()封装
class Student: addr = "123" def __init__(self, name, age): self.name = name # 将属性封装到类的内部 self.age = age def print_info(self): print(self.name, self.age) # print(self.addr) # self.addr = "222" # print(self.addr) # 不能通过实例去修改类属性的 # print(Student.addr) # 在同一个类创建多个对象之间,属性是互不干扰的 tk = Student("天空", 19) xk = Student("星空", 29) tk.print_info() xk.print_info()