# 面向对象
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)