学习主题:类和对象
学习日期:2020-02-09
Python 版本:3.7.4
学习说明:这里很难,尤其是第一次接触面向对象这个概念,我下面写的也不是很好很明白。
第36讲 对象的概念
对一个物体怎么描述的。
比如这个物体就是狗
狗的基本特征就是,一个头,四只腿,有毛,有尾巴,等等
狗还能干什么,他能跑,能吃东西也能咬人,能用鼻子闻东西等等。
总结一下:
对象=属性+方法,这里用类可能更准确点,这么就是一个类,Class。
类的中文意思就是:物以类聚。一类人。什么的,就是拥有一样特征的人,比如说酒鬼,对,这么一类人就是爱喝酒,他们有爱喝酒这样的属性,他们有 喝酒这样的本事方法。
对象的概念其实很广的,在Python中一个函数,一个方法,一个变量什么的,都可以称为对象。所以说,Python无处不对象。
- 定义一个类
#下面就定义了“狗”类
#记住:Python中类名首字母要大写,函数的首字母小写,这样就容易区别了
class Dog:
#属性
legs=4
head=1
mouth=1
#方法
def beat(self):
print('dog can beat ')
def run(self):
print('dog can run')
def smell(self):
print('dog can smell')
- 调用“类”
>>>
RESTART: C:/Users/SNIPER/AppData/Local/Programs/Python/Python37/SniperPyWorks/game4.py
>>> d=Dog()
>>> d
<__main__.Dog object at 0x0000000002F65B08>
>>> type(d)
<class '__main__.Dog'>
>>> d.legs
4
>>> d.beat
<bound method Dog.beat of <__main__.Dog object at 0x0000000002F65B08>>
>>> d.beat()
dog can beat
>>>
OO是什么?
即就是orient object 面向对象的意思
OO的特征:封装,继承,多态。
#继承举例说明
>>> class list1(list):
pass
>>> list2=list1()
>>> list2.append(1)
>>> list2
[1]
#举例说明什么是多态
#定义一个类A
>>> class A:
def fun(self):
print('i am A')
#定义一个类B
>>> class B:
def fun(self):
print('i am B')
>>> a=A()
>>> b=B()
>>> a.fun()
i am A
>>> b.fun()
i am B
#发现上面同样是fun函数,但是结果不同,所以这就是 多态
第37讲 面向对象编程
self是什么?
Python 的self 相当于 C++ self的this指针
公有和私有?
Python是伪私有
第38讲 继承
让相似的进行传递,不用再重新写。这种办法就叫做 继承。
被继承的叫:基类(或叫父类,超类 )
继承者叫:子类
用法如下:
#DerviedClassName 子类
#BaseClassName 基类(或叫父类,超类 )
class DerviedClassName(BaseClassName):
...
举个栗子
>>> class Parent:
def hello(self):
print('正在调用父类的方法...')
>>> class Child(Parent):
pass
>>> p=Parent()
>>> p.hello()
正在调用父类的方法...
>>> c=Child()
>>> c.hello()
正在调用父类的方法...
>>>
>>> class Parent:
def hello(self):
print('正在调用父类的方法...')
>>> class Child(Parent):
def hello(self):
print('正在调用 子类 的方法')
>>>
>>> c=Child()
>>> c.hello()
正在调用 子类 的方法
super 函数的使用。
多继承的使用。
第39讲 一些概念
组合
>>> class Classmate:
def __init__(self,y):
self.num=y
>>> class Teacher:
def __init__(self,x):
self.num=x
>>> class Classroom:
def __init__(self,x,y):
self.teacher=Teacher(x)#实例化
self.classmate=Classmate(y)#实例化
def print_num(self):
print('教室里面有老师 %d 名,学生 %d 名'% (self.teacher.num,self.classmate.num))
>>> classroom=Classroom(1,40)
>>> type(classroom)
<class '__main__.Classroom'>
>>> classroom.print_num
<bound method Classroom.print_num of <__main__.Classroom object at 0x0000000002FAA988>>
>>> classroom.print_num()
教室里面有老师 1 名,学生 40 名
以上就是一个组合的例子。就是把几个没有继承关系,一般是横向平行关系的几个类,把之实例化放在一起。
类,类对象,实例对象
#C是类 定义
>>> class C:
num=0
#a,b为 实例对象,下面的C是类对象
>>> a=C()
>>>> a.num
0
>>> a.num=10
>>> a.num+=5
>>> a.num
15
>>> b=C()
>>> b.num
0
如果,属性和方法相同,那么会出现什么问题
>>> class C:
def x(self): #x方法
print('x!!')
>>> c=C()
>>> c.x()
x!!
>>> c.x=1
>>> c.x #查看属性
1
>>> c.x()#查看方法
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
c.x()
TypeError: 'int' object is not callable
#z这里已经报错了
因此,要注意:
- 不要试图在一个雷里边定义出所有能想到的特性和方法,应该要利用继承和 组合机制来进行扩展。
- 用不同的词性命名,如属性名用名词,方法用动词。
绑定
Python 严格要求方法需要有实例才能被调用,这种限制其实就是Python 所谓的绑定概念。
第40讲 一些相关的BIF
#issubclass(class,classinfo)
>>> class A:
pass
>>> class B(A):
pass
>>> issubclass(B,A)
True
>>> class C:
pass
>>> issubclass(B,C)
False
#hasattr(object,name)测试一个对象里面是否有某个属性
#注 attr的全称为attribute ,属性的意思
#getattr(object,name[,default])
#setattr(object,name,value)
#property