-
函数、代码段、构造函数、析构函数、实例方法、类方法、静态方法、私有方法
# 函数:自由函数,跟类无关 def function(): print('This is 函数') # 类内的函数: # 1)self 实例方法,若以__开始不以__结束则为私有方法 # 2)@classmethod + cls 类方法,@classmethod可以省略但pycharm会给予警告 # 3)@staticmethod 静态方法,如无@staticmethod则必须移出类称为自由函数 class Person: # 代码段,只要所在py文件被import就会执行,且整个程序运行过程只执行一次 print('This is 代码段') # 构造函数__init__ 析构函数__del__(一般不要使用) def __init__(self, name): print('This is 构造函数') self.name = name # 实例属性,一般在__init__中定义 # (实例)方法:通过参数self关联到所属的实例 # 可以访问 实例属性 实例方法 类属性 类方法 # 只能用 实例 调用 def greet(self): print('This is 实例方法') self.age = 5 # 实例属性,一般在__init__中定义,但允许在其他地方定义 # 类方法:通过参数cls关联到所属的类 # 只能访问 类属性 类方法 # 可以通过 类和实例 调用 @classmethod def cmeth(cls): print(f'This is 类方法 {cls}') # 静态方法:不能有cls、self,不能访问 实例属性 实例方法 类属性 类方法 # 仅仅托管于某个类的名称空间中,便于使用和维护 @staticmethod def smeth(): print('This is a static method') # 私有方法,通过在名称前加两个_实现,若在后面也加称为__private_method__,则不是私有方法 def __private_method(self): print('I have a self!')
-
类属性和实例属性
class MemberCounter: # 类属性,只要所在py文件被import就会创建,且整个程序运行过程只执行一次 # 可以使用 类 访问,也可以使用 实例 访问 # 如果通过 实例 访问并赋值,那么 实例中的值 将隐藏 类中的值(但对于其他实例仍然不变) members = 0 def init(self): MemberCounter.members += 1 if __name__ == '__main__': m1 = MemberCounter() m1.init() # 输出 1 1 print(m1.members) print(MemberCounter.members) m2 = MemberCounter() m2.init() # 输出 2 2 2 print(m1.members) print(m2.members) print(MemberCounter.members) m1.members = "aaa" # 输出 aaa 2 2 print(m1.members) print(m2.members) print(MemberCounter.members)
class MemberCounter: # 类属性 members = 0 def init(self): # 定义 实例属性members,与类属性members不是一个 # 有了这个members之后,上面的类属性members只能通过类名访问 self.members = "bbb" if __name__ == '__main__': m = MemberCounter() m.init() # 输出 bbb 0 print(m.members) print(MemberCounter.members)
-
继承 重写
继承需要调用父类的构造方法
class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print('Aaaah ...') self.hungry = False else: print('No, thanks!') class SongBird(Bird): def __init__(self): self.sound = 'Squawk!' def sing(self): print(self.sound) >>>sb = SongBird() # 将出现错误,因为父类Bird的初始化方法没有被调用,实例属性hungry没有被初始化 >>>sb.eat() # 解决方案1(在较老的python版本中使用) class SongBird(Bird): def __init__(self): Bird.__init__(self) self.sound = 'Squawk!' def sing(self): print(self.sound) # 解决方案2(推荐,在新的python版本中使用) class SongBird(Bird): def __init__(self): super().__init__() # 或者super(SongBird, self).__init__() self.sound = 'Squawk!' def sing(self): print(self.sound)
#继承并重写hello方法 class A: def hello(self): print("Hello, I'm A.") class B(A): def hello(self): print("Hello, I'm B.") >>>a = A() >>>b = B() >>>a.hello() Hello, I'm A. >>>b.hello() Hello, I'm B.
-
抽象类
from abc import ABC, abstractmethod class Talker(ABC): @abstractmethod def talk(self): pass class Knigget(Talker): def talk(self): print("Ni") >>>k = Knigget()
五、类和对象
于 2022-01-18 22:07:15 首次发布