类属性和实例属性
类属性
通过类对象可以直接访问的属性
抽象概念的固有属性, 要考虑当前抽象概念的普适性
代码语言:javascript复制# 贴标签不是一个特别好的抽象, 原因他没有一个普适性
class Developer:
programing_language = None
busy = True
私有属性
不希望外部更改, 只作用于类内部
通过__变量名
来声明私有属性
class Lottery:
__items = ["mac", "ipad", "iphone"]
通过类._类名__变量名
来访问私有属性
print(Lottery._Lottery__items)
实例属性
绑定在实例上的属性, 只能通过该实例进行访问
实例的自有属性
代码语言:javascript复制class Developer:
programing_language = None
busy = True
__case = "doing something"
d_python = Developer()
d_python.programing_language = "python"
d_java = Developer()
d_java.programing_language = "java"
print(d_java.programing_language)
print(d_python.programing_language)
- 私有属性
- 通过
self.__变量名
来声明私有属性 - 通过
实例._类名__变量名
来访问私有属性
- 通过
类方法, 静态方法, 实例方法
类方法
仅供类调用的方法
通过classmethod
装饰器来声明一个类方法
自定义类创建
代码语言:javascript复制class Developer:
programing_language = None
busy = True
__case = "doing something"
def __init__(self, hairs):
self.__hairs = hairs
@classmethod
def __new__(cls, *args, **kwargs):
print("init class")
return super().__new__(cls)
@classmethod
def get_case(cls):
return cls.__case
静态方法
类可以直接调用的方法
通过staticmethod
装饰器装饰
对一类抽象行为的归类
代码语言:javascript复制class MyMath:
@staticmethod
def add(a, b):
return a b
实例方法
- 仅供实例调用的方法
接口, 协议和抽象基类
接口
对象公开方法的子集, 让对象在系统中扮演特定的角色.
代码语言:javascript复制list实现了增删改查的接口, 只要有一个接口没有实现那就不属于list
tuple只提供了查的接口
协议
非正式的接口, 协议与继承没有关系, 一个类可能会实现多个接口, 从而让实例扮演多个角色
代码语言:javascript复制list扮演者列表的角色, 但同时也是一个序列, 序列并不是一个实体类.
协议的应用
代码语言:javascript复制class MyDict(dict):
def __iadd__(self, other):
self.update(other)
return self
def __str__(self):
return f"My Dict {self.items()}"
抽象基类
把客观事物封装成抽象的元类, 区分概念和实现.
只要有@abc.abstractmethod
装饰器的类就是抽象基类
import abc
class Mixin:
def sign(self):
pass
def rank(self):
pass
class Gamer:
@abc.abstractmethod
def sign(self):
pass
class GoGamer(Mixin, Gamer):
pass
class Swimmer(Mixin, Gamer):
pass