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() # 也可以实例化后调用
- 让jQuery Tools Scrollable控件在Mobile Web里面支持resize功能
- CentOS6.5上golang环境配置
- 马斯克频发推文,或在揭示特斯拉明年大动作?
- yum安装出现No package nodejs available解决办法
- InfoPath中repeationg section动态填充数据
- CSS魔法堂:重新认识Box Model、IFC、BFC和Collapsing margins
- jenkins 入门教程(中)
- docker学习(1) 安装
- Ajax等待返回结果时,弹出一个友好的等待提示
- Facebook Like Button在IE上的bug
- CSS魔法堂:hasLayout原来是这样!
- jetty 9 嵌入式开发示例
- 人工智能之头像识别
- mysql : utf8mb4 的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS 7 解决丢失 nginx.pid
- $(function(){})和$(document).ready(function(){})
- javascript中的setTimeout() 方法和clearInterval() 方法和setInterval() 方法
- matlab生成数字1-n的列向量
- JavaScript中的匿名函数及函数的闭包
- ios下Safari无法触发click事件的处理
- 禁止网页右键、复制、另存为、查看源文件等功能
- ajax知识点
- 前端特效常用代码
- VBA编写Ribbon Custom UI编辑器02——编码转换
- web开发中常用的算法和函数
- nodejs创建线程问题
- 3分钟短文 | Laravel如何改造复杂的多表联合查询,这很高效!
- matlab中类的重载简析
- Js输入验证