前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3 的面向对象

Python3 的面向对象

作者头像
用户2337871
发布2020-10-26 17:31:21
3450
发布2020-10-26 17:31:21
举报
文章被收录于专栏:git
代码语言:javascript
复制
# 面向对象

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)
代码语言:javascript
复制
class A(object):
    bar = 1

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

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


A.func2()  # 不需要实例化
代码语言:javascript
复制
class C(object):
    @staticmethod
    def f():
        print('runoob');
 
C.f();          # 静态方法无需实例化
cobj = C()
cobj.f()        # 也可以实例化后调用
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档