很多人,一看到面向对象,就是一脸懵逼
包括我现在也是懵逼的。
自学的话,很难真正的理解他底层的东西。
在python中,有这样一句话:一切揭是对象
python的面向对象有三大功能
(封装, 继承, 多态)
~~~一脸懵逼
其实:面向对象就是按照真实世界客观事物的自然规律进行编译
可以说是一种编程的 思想和模式
简称为:OPP语言
先来代码吧 边写代码边说方法吧!
class name(父类):
类体
(定义一个类的方法很简单 使用class方法定义一个类)
(父类可以省略,默认为object)
(和众多开发语言一样,父类都是object)
类体:主要为类的成员变量和成员函数等等。
第一个框:创建对象
第二个框:对象调用类的方法
执行结果就可以打印出来了!
这是一个简单的类的创建和对象的调用的方法
其实:
init方法是类的构造方法:
这个例子是否直观一点了呢?
self参数是默认的 不需要传递值。
通过Admin这个类创建了 zhangtao 这个对象
调用zhangtao这个对象的age
得到了zhangtao的年纪。 应该直观一点了哈~(我也很懵逼,纯属瞎忽悠)
一般在python中的方法
以__双下划线开头的一般称为魔法方法是官方保留的
说起这个来了 说一下python的模仿方法的小结和功能实现吧!
直接上代码吧,边看边讲:
看图:
init方法:为python的构造方法,
str方法: 是针对于让人更好理解的字符串格式化
repr方法: 是针对于让机器更好理解的字符串格式化
下面介绍一下:
hash 和 dir 这两种方法:
算了,他妈的 我也不会 一般用不到 忽略。
讲讲python的控制访问的魔法方法吧
getattr
setattr
delattr
getattribute
直接上代码:(因为这个编辑器个人不习惯上截图吧)
讲解:
创建了一个test的类
通过类 创建了一个 x对象
当调用一个x对象没有的方法的时候
这个时候就会触发 getattr模仿方法
从而将传递进去的字符串 输出。
官方话语:(斯文的说法):
在找不到属性的情况下,正常的继承object的对象都会抛出一个异常
我们这种通过 getattr方法 改变了在找不到属性的时候的类的行为。
上图是setattr方法:
self.world=world 是对初始化的world进行赋值
注意 这个在进行world赋值的时候 就调用了setattr方法,
这个例子来看 world 就是 name world的值就是value
所以进行了改写 从而减了100 得到23
在程序执行结束之前,调用了 del方法 删除了这个 x.world
所以会出现 找不到这个对象。
self.age/self.sex /self.weigh 就称之为实例变量
类变量:
类变量是 所有 实例 共有的变量。
python的私有属性:
单下划线开头: 告诉别人这是私有属性 外部依旧可以访问和更改
双下环线开头: 在程序外面不能访问和更改
python3中类的难点:
私有属性 和 私有方法 是类独自私有的
他不能再类的外部直接调用,但是可以通过类的实例方法来间接性调用。
python中的静态方法
静态方法和类方法在python2.2中被引用
经典类 和 信使 类 都可以使用。
同时。一对内建函数 staticmeethod 和 classmethod 被引入
静态方法:
静态方式是类中的函数 不需要实例化
例子:
import time
class TimeTest(object):
def init(self,hour,minute,second):
self.hour = hour
self.minute = minute
self.second = second
@staticmethod
def showTime()
return time.strftime(“%H:%M:%S”,time.localtime())
print TimeTest.showTime() ## 可以通过类名直接调用静态方法
t = TimeTest(2,10,10)
nowtime = t.showTime()
print nowtime
狭义的讲
静态方法是指勒种无需实例参与 就可以调用的方法(不需要self参数)
在调用静态方法的过程中,不需要实例化。
可以直接在类之后使用. 调用
静态方法python2 和python3 的区别:
在python2中 如果一个类的方法不需要self参数 必须声明他是静态方法
就是加上 @staticmethod这个装饰器
在python3中 如果一个类的方法不需要self参数,不在需要声明静态方法
但是这能 通过这个类去调用这个方法 如果使用实例调用就会引发异常。
类方法在python中用到的比较少,可以忽略这一段
类方法传入的第一个参数是 cls ,是类本身。
类方法可以通过类直接调用
代码:
从运行结果来看:
无论是类调用 还是 实例调用 类方法
类方法都能够正常运行
当执行这一段代码:
执行 s.name 可以正常执行没有报错
说明 学生这个类 继承了 父亲的name属性
但是执行t.name 的时候报错
说明: Teacher 重写构造函数 导致丢失了name属性
super()函数:可以重写父类的init方法