python 类属性和实例属性、类方法, 静态方法, 实例方法、接口, 协议和抽象基类 (4.2)

2022-09-28 13:20:45 浏览数 (1)

类属性和实例属性

类属性

通过类对象可以直接访问的属性

抽象概念的固有属性, 要考虑当前抽象概念的普适性

代码语言:javascript复制
# 贴标签不是一个特别好的抽象, 原因他没有一个普适性
class Developer:
    programing_language = None
    busy = True

私有属性

不希望外部更改, 只作用于类内部

通过__变量名来声明私有属性

代码语言:javascript复制
class Lottery:
    __items = ["mac", "ipad", "iphone"]

通过类._类名__变量名来访问私有属性

代码语言:javascript复制
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装饰器的类就是抽象基类

代码语言:javascript复制
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

0 人点赞