Python3 的面向对象

时间:2022-07-28
本文章向大家介绍Python3 的面向对象,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
# 面向对象

import abc
from enum import Enum, unique


@unique  # unique确保无重复值
class Weekday(Enum):
    """
    枚举类
    """
    # 左边为name,右边为value
    Sun = 0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6


class Person(metaclass=abc.ABCMeta):
    """
    Person 为抽象类,Person的子类需要实现抽象方法
    """

    @abc.abstractmethod
    def abs_m(self):
        print("Person:abs_m")


class Student(Person):
    """
    Student Doc
    """

    # 实现抽象方法
    def abs_m(self):
        print("absMethod")

    # 使用父类引用
    def sup(self):
        super().abs_m()

    # count为类属性
    count = 0

    # 类方法
    @classmethod
    def cm(cls):
        print("classMethod:", Student.count)

    # 静态方法
    @staticmethod
    def sm():
        print("staticMethod:", Student.count)

    # 实例私有方法
    def __p(self):
        # 如果没有使用到self,这里可能会警告this method may be static
        print("私有方法", self)

    # 定义该类只允许有这些属性
    __slots__ = ('name', '__age', "_gender")

    def __init__(self, name, age, gender):
        # 这是实例属性,外部可以直接访问
        self.name = name
        # 两个下划线开头是私有属性,在外部不能访问(如果要强行访问,可以使用s._Student__name,但不建议这样做)
        self.__age = age
        # 一个下划线开头也表示私有属性,在外部可以直接访问,但不建议访问(为什么这样设计?)
        self._gender = gender
        pass

    # 双下划线开头和结尾的是特殊方法或变量,不是私有的,外部可以访问
    # 因此不要把方法或属性名定义为双下划线开头和结尾
    def __str__(self):
        return f"{self.name}, {self.__age}, {self._gender}"


if __name__ == '__main__':
    print(Student("jack", 12, "male").cm())
    print(Student("jack", 12, "male").sm())

    s = Student("jack", 12, "male")

    # s的具体类型
    print(type(s).__name__)

    # 内置attr函数使用
    print(hasattr(s, "name"))
    print(getattr(s, "name"))
    # print(delattr(s, "name"))
    # print(setattr(s, "abc", 1))

    # s是否是某个类型
    print(isinstance(s, Student))

    # Student类是否是某个类的子类
    print(issubclass(Student, object))

    # 调用s.__str__()方法
    print(s)

    # 使用枚举类
    day = Weekday.Mon
    print(day.name)
    print(day.value)
class A(object):
    bar = 1

    def func1(self):
        print('foo')

    @classmethod
    def func2(cls):
        print('func2')
        print(cls.bar)
        cls().func1()  # 调用 foo 方法


A.func2()  # 不需要实例化
class C(object):
    @staticmethod
    def f():
        print('runoob');
 
C.f();          # 静态方法无需实例化
cobj = C()
cobj.f()        # 也可以实例化后调用