类
面向对象
什么是类,什么是对象
类是具有相同属性和功能的一类事物
类的结构分两大部分:静态变量,动态方法。如果要查看类中所有内容:__dict方法
对象是类的具体表现
实例化对象的过程
首先在内存中开辟一块空间,自动执行init方法将实例化的对象地址传入self参数中,在init方法中通过self给对象空间添加属性(实例变量)
一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.dict:查出的是一个字典,key为属性名,value为属性值
二:特殊的类属性
类名.name# 类的名字(字符串)
类名.doc# 类的文档字符串
类名.base# 类的第一个父类(在讲继承时会讲)
类名.bases# 类所有父类构成的元组(在讲继承时会讲)
类名.dict# 类的字典属性
类名.module# 类定义所在的模块
类名.class# 实例对应的类(仅新式类中)
类属性的补充
类变量:所有实例都共享这个变量
class Person:
# 类变量,所有实例对象都共享这个变量
country = '中国'
# 方法
def __init__(self, name, age):
# 属性
self.name = name
self.age = age
# 方法
def say(self):
print('我是{self.name},我今年{self.age}岁!'.format(self=self))
p3 = Person('王五', 3000)
p3.country = '大秦'
print(p3.name) # 王五
print(p3.country) # 大秦
p4 = Person('赵六', 30)
print(p4.name) # 赵六
print(p4.country) # 中国
p3.country = '大秦'的时候,并没有去改变类中的country,而是给自己添加了一个实例属性,这个属性只有在p3这个实例对象中才是存在的,在p4中是不存在的。
总结
类变量,是定义在类中的变量,该类的实例对象都可以访问到该变量,但是实例对象只能查看不能修改。想要修改类变量,只能通过类名来修改。
实例变量,给实例对象用的。
类变量,实例对象共享的。
类中的方法分为实例方法、静态方法和类方法。
实例方法是我们接触和使用最多的,实例对象可以直接访问的方法就叫实例方法(成员方法)
class Computer:
# 实例方法
def play(self):
print('我的电脑可以玩游戏')
c1 = Computer()
c1.play() # 实例对象直接调用实例方法
静态方法
静态方法不需要传递“self”参数,也就是说,当类中的方法不需要传入实例变量的时候,就可以使用静态方法。
定义静态方法时需要我们在该方法上添加@static,示例如下:
class Computer:
# 实例方法
def play(self):
print('我的电脑可以玩游戏')
@staticmethod
def fire():
# 方法不需要传入实例对象变量
print('我的电脑非常牛B,可以煎鸡蛋')
c1 = Computer()
c1.play() # 实例对象直接调用实例方法
c1.fire()
静态方法和静态变量一样,都可以使用类名直接访问。
类方法
类方法是由类调用的方法,他的第一个参数必须是类本身。类方法在被调用的时候,不需要调用者传递该参数,不需要创建实例,解释器会自动的把类当成第一个参数,类方法在定义的时候需要在类方法上添加@classmethod。通过类名或实例名调用
class Computer:
# 实例方法
def play(self):
print('我的电脑可以玩游戏')
@staticmethod
def fire():
# 方法不需要传入实例对象变量
print('我的电脑非常牛B,可以煎鸡蛋')
@classmethod
def calc(ojb, a, b):
print(ojb)
return a + b
c1 = Computer()
c1.play() # 实例对象直接调用实例方法
c1.fire()
ret = Computer.calc(10, 20) # <class '__main__.Computer'>
print(ret) # 30
属性方法
属性方法其实就是把类中的方法改造成属性的一种写法,该写法需要在方法上加上@property,详细看python之路周末班:Python基础之面向对象基础 - Q1mi - 博客园
优点就是这个属性是动态的,不是写死的,例如年纪
私有成员
在某些场景下,我们可能会在类中存储一些只有我们自己能访问的信息。在Python中我们可以使用两个连续的双下划线将属性或方法变为私有的。
私有变量
私有方法
这些被双下划线开头的属性或方法都只能在类的内部调用,不能继承
命名空间
调用习惯
组合
什么情况下比较适合用组合
继承
单继承
继承什么时候用
当存在A has B 时用继承,但尽量用组合去替代继承
单继承的调用顺序:优先从本类中寻找,没有的话,再从父类中寻找。
如果同时调用子类和父类方法,优先从子类中调用,然后手动的调用父类方法
多继承
object是所有类的父类
什么是函数,什么是方法
用类名调用类里面的函数就叫函数
用对象名调用类里面的函数就叫方法
from types import FunctionType,MethodType
class A(object):
def func(self):print('in A')
print(isinstance(A.func,FunctionType))#True
a=A()
print(isinstance(a.func,MethodType))#True
多继承的继承顺序
背诵
python3所有类都继承object类
只要继承object类就是新式类
经典类在python3中不存在,在python2中不主动继承object类
通过继承实现类的开发规范
多态
python中一切皆对象,处处是多态

浙公网安备 33010602011771号