大佬教程收集整理的这篇文章主要介绍了面向对象(三),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
1.动态方法
语法结构
对象方法
class A:
def func(self):
pass
对象来调用会自动将对象当做第一个参数传入(self)
<br />
类方法
class A:
@classmethod
def func(cls):
pass
对象和类调用的时候都是将类当做第一个参数传入(cls)
<br />
2.静态方法
语法结构
class A:
@staticmethod
def func():
pass
相比于动态方法更像一个普通的方法
不需要特定参数,无论谁来调都需要传入固定的参数
概念:获得本不属于自己的功能或者数据。
基本使用:
class 类名(父类名):
子类,派生类:继承者
父类,基类:被继承者
单继承
对象 ——》 类 ——》父类 ——》 父类的父类
多继承
非菱形继承,一直走到父类 深度优势
菱形继承,走完所有子类,最后到父类 广度优先
重新定义父类的功能
如果需要使用父类方法,super().父类的方法。
找到自己的目标,当目标完成时可以悠闲的回顾自己的往日,这便是最美好的事情了
class B: # 定义一个父类
def a(self, number): # 写入a函数
number += 1 # 父类会对形参number+1
print('加了1')
class A(B): # 定义一个子类
def a(self, number): # 重写a函数
if number == 0: # 如果形参number等于0
number += 100 # 加100
print('加了100')
else:
super().a(number) # 否则正常运行父类函数a
q = A()
q.a(0)
加了100
a = 100
q = A()
q.a(1)
加了1
a = 2
封装也是面向对象三大特性之一
概念:将类中某些名字'隐藏'起来,只允许内部使用
内部使用需要一个通道‘接口’
隐藏方法:
class A(object):
__number = 100
class A(object):
def __init__(self,number):
self.__number = number # 隐藏数据
def check_info(self):
print('数字%d'%(self.__number)) # 调用接口
a = A(1)
a.check_info()
这样做的目的是为了阻隔外部调用这个类中内部的数据,类中会提供调用相对于通道(接口)。
将方法伪装成数据
有时候很多数据需要经过计算方法才可以获得,但是这些数据像是直接产生出来,更像数据
BMI指数
class Person(object):
def __init__(self, name, height, weight):
self.__name = name
self.height = height
self.weight = weight
@property
def BMI(self):
# print('%s的BMI指数是:%s' % (self.name, self.weight / (self.height ** 2)))
return '%s的BMI指数是:%s' % (self.__name, self.weight / (self.height ** 2))
# p2 = Person('eason',1.90,85)
# # p2.BMI() # 23.5
多态是面向对象三大特性中最后一个,我们只要理解什么是多态,什么是面向对象中的多态。
多态:一种事物的多种形态
在面向对象中,多态性:
class Animal(object):
def speak(self):
pass
class Cat(Animal):
def speak(self):
print('喵喵喵')
class Dog(Animal):
def speak(self):
print('汪汪汪')
class Pig(Animal):
def speak(self):
print('哼哼哼')
c1 = Cat()
d1 = Dog()
p1 = Pig()
c1.speak()
d1.speak()
p1.speak()
对同一个类执行相同的方法,由于其类中的对象不同,获得的形态也不同,这就是多态
鸭子类型理论是python中独有的
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
不同的子类继承了相同父类,所产生相同的功能
class F1:
pass
# 假设,S1是我们的正统类,它继承于根正苗红的F1,是我们的正统类
class S1(F1):
def show(self):
print('S1.show')
# S2是路人甲,是个歪瓜裂枣,但是他自己也有一个叫show的方法。
class S2:
def show(self):
print('S2.show')
def Func(obj):
"""Func函数需要接收一个F1类型或者F1子类的类型"""
obj.show()
s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show
s2_obj = S2()
Func(s2_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S2 的show方法,结果:S2.show
“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。
通过字符串来操作对象的数据和功能
Python类的属性进阶 提供用字符串来操作类的属性/方法的方式。主要工具函数
hasattr(obj_bame,’属性名’)判断对象是否含有字符串对应的数据或者功能
setattr(obj_name,’属性名’,值)根据字符串给对象设置键值对(名称空间中的名字)
getattr(obj_bame,’属性名’)根据字符串获取对应的变量名或者函数名
delattr(obj_bame,’属性名’)根据字符串删除对象对应的键值对(名称空间中的名字)
getattr
利用反射获取配置文件中配置信息
import 配置文件名
dir(settings) # 获取对象中所有可以使用的名字
getattr(settings, '配置文件中的名字')
class FtpServer: # 定义一个类
def serve_forever(self): # 定义一个函数
while True: # 循环
inp = input('input your cmd>>: ').strip() # 获取用户输入
cmd, file = inp.split() # 分割空格并赋值给cmd和file
if hasattr(self, cmd): # 如果该self对象中拥有用户输入的功能
func = getattr(self, cmd) # 调用实际功能
func(file) # 传入参数运行该功能
def get(self, file): # get功能
print('Downloading %s...' % file)
def put(self, file): # put
print('Uploading %s...' % file)
f = FtpServer()
f.serve_forever()
以上是大佬教程为你收集整理的面向对象(三)全部内容,希望文章能够帮你解决面向对象(三)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。