Python 周记四 廖雪峰教程

面对对象编程
object oriented programming 简称OOP,是一种程序设计思想

面向过程的程序设计:计算机程序视为一系列的命令集合,一组函数的顺序执行。
面向对象的程序设计:把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发来的消息,并处理这些消息。

一,类与实例:

类class:自定义的对象数据类型【抽象】 实例instance:一个个具体的对象【具体】
即:对象=属性+方法
实例化对象就是可以传入一些参数作为这个对象的属性,并且可以调用里面的方法
``
class Person(object):#这个类别叫人

def __init__(self,name,age,height):#人有很多属性,比如姓名、身高、体重
    self.name=name
    self.age=age
    self.height=height  

def print_introdu(self):
      print('我叫%s我今年%s岁我的身高是%s厘米' %(self.name,self.age,self.height))

一个有意思的比喻:
上帝
class 类 (人)
instance 实例 (你,我,他)
你会有些属性(身高,年龄,体重)
你会有些技能(吃饭,泡妞)
init 方法的主要作用,就是初始化你的属性,这些属性,在上帝初始化你的时候就要赋予给你,比如zhangsan = Person(170,29,50)这时上帝就把你创造出来了,也就是实例化了你,然后,你到底有哪些技能呢,这就看有没有在类里面定义了,如果有定义泡妞的技能,那么你就可以调用泡妞的技能来泡妞,大致就是这样吧,看看下面的例子就更清楚了

二,访问限制:

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。
但是,外部代码还是可以自由地修改一个实例的name、score属性。所以可以在属性名称前面加上两个下划线 __ ,从而保障内部属性不被外部访问。
如果,外部函数需要修改,获取内部属性,则需要为类添加get,set方法。

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

三,继承和多态

继承:可以使子类获得父类的全部功能
多态: 子类自身优先级大于父类

“开闭”原则:
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的run_twice()等函数

动态语言:鸭子类型,即一个对象具备了另一个的对象的属性,方法,既可以被当作另一个对象调用

四, 使用__slots__
定义一个特殊的__slots__变量,可以做到限制该class实例能添加的属性

五,使用@property
@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

class Student(object):

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2015 - self._birth

birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来

六,多重继承
一个子类,可以继承多个父类的功能,
由于Python允许使用多重继承,因此,MixIn就是一种常见的设计。
只允许单一继承的语言(如Java)不能使用MixIn的设计。

七,枚举类:

from enum import Enum, unique

@unique
class Weekday(Enum):
    Sun = 0 # Sun的value被设定为0
    Mon = 1
    Tue = 2
    Wed = 3
    Thu = 4
    Fri = 5
    Sat = 6

不是很懂

八,创建类

def fn(self, name='world'): # 先定义函数
      print('Hello, %s.' % name)
      
Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class

type()功能比较容易掌握,相对比较困难的元类,现在看的不是很懂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值