面向对象进阶,Python之面向对象总计

① 、面向对象

Python之面向对象计算,python面向对象

① 、面向对象

   ① 、面向进程

     
 a、优点:非常大的降低了写程序的复杂度,只需求顺着执行的手续,堆叠代码即可

     
 b、缺点:一套流水线可能流程正是来化解一个标题,代码正是牵一发而北京全身

   二 、面向对象

     
 a、优点:消除程序的扩充性,对某八个目标单独修改,会应声反应到一切系统中

     
 b、缺点:可控性差,不恐怕向面向进度的程序设计流水生产线式的能够很精准的估计难题的处理流程与结果,面向对象的先后一旦初阶就有对象时期的相互化解难点。

   ③ 、 类:具有相同特征的一类东西(人、狗、老虎)

   ④ 、对象/实例:具体的某多个事物(隔壁阿花、楼下旺财)

   五 、实例化:类——>对象的进度

   六 、在python中,用变量表示特征,用函数表示技术,由此具有同等特征和技能的一类东西正是‘类’,

   七 、对象是则是这一类东西中切实的一个

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法,也叫动态属性
        print("person is walking...")

class 类名:
    类属性 = None
    def __init__(self,对象属性):
        self.对象属性 = 对象属性

    def 方法名(self):
        pass

实例 = 类名(10)
实例.方法名()

    ⑧ 、类的两种成效:属性引用和实例化

    玖 、属性引用(类名.属性)

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

   
十 、例化:类名加括号正是实例化,会自动触发__init__函数的运转,可以用它来为每种实例定制本人的特点

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def __init__(self,name):
        self.name = name  # 每一个角色都有自己的昵称;

    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

    11、

类名
    类名.类属性
   类名.方法名

实例 = 类名(参数,参数)  #实例就是对象

实例
    实例.方法名()
   实例.对象属性

实例增加属性
实例.新的属性名 = 1000
print(实例.新的属性名)

   12、关于self

self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字.

对象/实例只有一种作用:属性引用

class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

dir(类) #返回类中的所有名字列表
isinstance(对象,类) #判断对象是否为类的实例
print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
print(Person.__module__)  #person类所在的模块
print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名

     1③ 、类命名空间与指标、实例的命名空间

         
 a、常见贰个类就会创建一个类的称谓空间,用来储存类中定义的具备名字,那么些名字改成类的性格

           b、而类有二种属性:静态属性和动态属性

  •  静态属性正是直接在类中定义的变量
  • 动态属性便是概念在类中的方法

开创1个对象/实例就会创设1个目的/实例的称号空间,存放对象/实例的名字,称为对象/实例的个性

外貌对象的组合用法:

构成指的是,在3个类中以其余二个类的靶子作为数据属性,称为类的组

列子:

美高梅开户网址 1

from  math  import pi
class Circular:
    def __init__(self,radius):
        self.radius=radius
    def area(self):
        return self.radius **2 * pi
    def perimeter(self):
        return 2 * self.radius * pi
circu=Circular(10)
print(circu.area())
print(circu.perimeter())

圆的周长与面积

     1四 、面向对象的三大特点

           a、继承

class Animal:      #父类  基类  超类
    def __init__(self,name,life_value,aggr):
        self.name = name
        self.life_value = life_value
        self.aggr = aggr


class Person(Animal):  #子类  派生类
    pass

class Dog(Animal): #子类  派生类
    pass

egg = Person('egon',1000,50)
print(egg.name)
print(egg.aggr

       

python2
class Dad:  #经典类
class Dag(object)  #新式类

python3
class Dad  ==  class Dag(object) #新式类

              ① 、继承的语法

 class 类名(父类名):
      想在子类中实现调用父类的方法
      在类内 ——super(子类名,self).方法名()
      在类外面 ——super(子类名,对象名).方法名()
      如果不指定继承的父类,默认继承object
      子类可以使用父类的所有属性和方法
      如果子类有自己的方法就执行自己的的
      如果是子类没有的方法就执行父类的
      如果子类父类都没有这个方法就报错

继承、抽象、派生
继承 是从大范围到小范围
抽象 小范围到大范围
派生 就是在父类的基础上又产生子类——派生类
        父类里没有的 但子类有的 ——派生方法
        派生属性
方法的重写
    父类里有的方法,在子类里重新实现

 

              ② 、继承的二种用途:                

                 
b:继承基类的法门,并且做出本身的改变或许扩充(代码重用)***
  ***

                 
a:评释有些子类包容于某基类,定义1个接口类Interface,接口类中定义

                       
 **
 了有的接口名(便是函数名)且从未实现接口的效果,子类继承接口类,并且完结接口中的作用**

           b、封装

                  1、优点:

                              a、将扭转隔断

                              b、封装使用

                              c、提升复用性

                              d、提升安全性

                  贰 、封装原则:

                              a、将不要求对外提供的剧情都隐藏起来

                              b、把品质都掩藏起来提供公共措施对其访问

                  ③ 、私有变量和个体方法

                             
a、在python中用双涂鸦的开首的的点子降属性隐藏起来(设置个人的)

property属性

property是一种奇特的质量,访问它时会执行一段成效(函数)然后重返值

  

         
 c、多态:”多态指的是一类东西有二种形状(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生实施的是放学操作,尽管两者信息一点差别也没有于,然则执行的效劳区别)

                   多态指的是:一类东西有各个情况

python自带多态:

  多态:同一类事物的多种状态

  python里处处都是多态,只是我们一般发现不了

  操作的时候不需要关心这个对象的数据类型,你只要用就行了

 

    15、反射     

        一 、反射:能够用字符串的法门去拜访对象的品质,调用对象的章程(不过不可能去拜谒方法),python中整整皆对象,都可以运用反射。

        ② 、反射有三种方式:

             
 hasattr:hasattr(object,name)判断1个指标是或不是有name属性或然name方法。有就重返True,没有就回来False

             
getattr:获取对象的性质或许措施,假如存在则打字与印刷出来。hasattr和getattr配套使用

                
供给专注的是,假若回到的是指标的章程,重回出来的是指标的内部存款和储蓄器地址,即使急需周转这几个法子,可以在末端添加一对()

               setattr:给目的的质量赋值,若属性不设有,先创立后赋值

               delattr:删除该目的内定的1特品质

          a、内置方法:isinstance和issubclass

               isinstance(obj,cls)检查是不是obj是或不是是类 cls
的对象

class Foo:
    pass
class Son(Foo):
    pass
s=Son()

print(isinstance(s,Son))

        b、内置方法:issubclass(sub, super)检查sub类是还是不是是
super 类的派生类 

class Foo(object):
    pass

class Bar(Foo):
    pass

issubclass(Bar, Foo)

 

     
 c、python面向对象中的反射:通过字符串的样式操作对象相关的习性,python中任何事物都以目的(都能够用反射)

检查是否含有某属性---hasattr 返回布尔值
获取属性---getattr   没有就会报错
设置属性---setattr
删除属性---delattr

       d、内置方法:__del__

析构方法,当对象在内部存款和储蓄器中被假释时,自动触发执行。

注:此措施一般不要定义,因为Python是一门高级语言,程序员在运用时无需关切内部存款和储蓄器的分配和自由,因为此工作都以付出Python解释器来施行,所以,析构函数的调用是由解释器在拓展垃圾回收时自动触发执行的。

class Foo:
    def __del__(self):
        print('fgs')
f=Foo()
print(123)
print(123)
del f
print(123)
print(123)
print(123)

 

     e、内置方法:item系列

美高梅开户网址 2

一,.接口类

   壹 、面向进程

__getitem__\__setitem__\__delitem__

    __new__

class A:
    def __init__(self):  #有一个方法在帮你创造self
        print('in init function')
        self.x=1
    def __new__(cls, *args, **kwargs):
        print('in init funct')
        return object.__new__(A,*args,**kwargs)
a=A()

     f、__str__和__repr__更改指标的字符串呈现

美高梅开户网址 3

class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4     def __repr__(self):
 5         return 'obj in str'  #这里只能是return
 6     # def __str__(self):
 7     #     return '%s obj in str'%self.name
 8 f = Foo('egon')
 9 print(f)  #优先执行__str__里面的内容
10 # 那么你是不是据地__repr__没用呢?
11 # print('%s'%f)  #执行的是__str__里面的返回值
12 # print('%r'%f)  #执行的是__repr__里面的返回值
13 print('==============')
14 print(str(f))  #当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
15 print(repr(f))
16 #1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
17 # 2.当__str__没有被实现的时候,就会调用__repr__方法
18 # 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
19 # 4.不管是在字符串格式化的时候还是在打印对象的时候,
20 # __repr__方法都可以作为__str__方法的替补,但反之则不行
21 # 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个:先实现__repr__

__str__,__repr__

    1五 、内置方法

           a、静态方法和类格局

             
 一 、类格局:有个默许参数cls,并且能够直接用类名去调用,能够与类属性交互(约等于足以行使类属性)

             
 贰 、静态方法:让类里的点子直接被类调用,就像是正规调用函数一样

           b、类形式和静态方法的相同点:都足以直接被类调用,不须求实例化

           c、类措施和静态方法的差异点:

          类方法必须有2个cls参数表示这一个类,能够应用类属性

           静态方法不要求参数

           d、绑定方法:分为一般方法和类措施

     普通方法:私下认可有1个self对象传进来,并且不得不被对象调用——-绑定到指标

     类方法:暗中同意有2个cls对象传进来,并且能够被类和指标(不推荐)调用—–绑定到类

           
e、非绑定方法:静态方法:没有安装暗中同意参数,并且能够被类和指标(不引进)调用—–非绑定

    1六 、接口类与抽象类

             a、 接口类:(在抽象类的功底上)

         在python中,私下认可是不曾接口类的           

                    接口类不可能被实例化(若是实例化会报错)

          接口类中的方法无法被实现

接口也就是做约束,让下面的类的方法都按照接口类中给出的方法去定义。如果接口类里面有的方法类里面没有,那么那个类就不能被实例化。(字面理解)

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

           b、抽象类

在python中,默认是有的

    父类的方法,子类必须实现

    抽象类(父类)的方法可以被实现

抽象类和接口类的区别:接口类不能实现方法,抽象类可以实现方法里面的内容

抽象类和接口类的相同点:都是用来做约束的,都不能被实例化

抽象类和接口类的使用:

  当几个子类的父类有相同的功能需要被实现的时候就用抽象类

  当几个子类有相同的功能,但是实现各不相同的时候就用接口类

 

壹 、面向对象
壹 、面向进程a、优点:一点都不小的骤降了写程序的复杂度,只必要顺着执行的步骤,堆叠代…

① 、面向对象

  1. 继承有三种用途  

     
 a、优点:相当大的回落了写程序的复杂度,只须求顺着执行的步子,堆叠代码即可

壹 、面向进程

  1>:继承基类的主意,并且做出本人的变更如故扩展(代码重用)  

     
 b、缺点:一套流水生产线只怕流程正是来消除三个标题,代码便是牵一发而天津全身

a、优点:非常的大的大跌了写程序的复杂度,只须要顺着执行的步子,堆叠代码即可

  2>:注解某些子类包容于某基类,定义1个接口类Interface,接口类中定义了一部分接口

   贰 、面向对象

b、缺点:一套流水生产线大概流程正是来消除3个题材,代码便是牵一发而西安全身

     
名(正是函数名)且尚未达成接口的法力,子类继承接口类,并且完结接口中的功能

     
 a、优点:化解程序的扩充性,对某3个目的单独修改,会立刻反应到方方面面系统中

贰 、面向对象

 

     
 b、缺点:可控性差,不能够向面向进程的顺序设计流水生产线式的能够很精准的预测难点的处理流程与结果,面向对象的次序一旦开首就有目的之间的竞相化解难题。

a、优点:化解程序的扩充性,对某三个指标单独修改,会及时反应到方方面面系统中

# 一:这样不好,我要统一一下支付的规则.

class QQpay:
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay:
    def pay(self,money):
        print('使用阿里支付%s元' % money)

a = Alipay()
a.pay(100)

b = QQpay()
b.pay(200)


# 二,统一支付的规则 归一化设计,统一 pay接口
class QQpay:
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay:
    def pay(self,money):
        print('使用阿里支付%s元' % money)

def pay(obj,money):        
    obj.pay(money)        #统一调用上面类中pay方法,

a = Alipay()
b = QQpay()

pay(a,100)
pay(b,200)


# 三,但是,来了一个野生程序员,他不知道你的约定俗成的规则,就会出问题

class QQpay:
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay:
    def pay(self,money):
        print('使用阿里支付%s元' % money)

class Wechatpay:
    def fuqian(self,money):
        print('使用微信支付%s元' % money)

def pay(obj,money):
    obj.pay(money)

a = Alipay()
b = QQpay()

pay(a,100)
pay(b,200)

c = Wechatpay()
c.fuqian(300)


# 四,解决方式
# 定义一个父类,什么都不写,只是要求继承我的所有类有一个pay方法,这样就制定了一个规范,这就叫做接口类,后者抽象类.
class Payment:
    def pay(self):pass

class QQpay(Payment):
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay(Payment):
    def pay(self,money):
        print('使用阿里支付%s元' % money)

class Wechatpay(Payment):
    def fuqian(self,money):
        print('使用微信支付%s元' % money)


def pay(obj,money):
    obj.pay(money)

a = Alipay()
b = QQpay()

pay(a,100)
pay(b,200)

c = Wechatpay()
c.fuqian(300)

#五,他还是不知道看你这些都继承了一个类,所以你要制定一个规范,强制他执行.
# 创建一个规范
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):    # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
    @abstractmethod
    def pay(self):pass  # 抽象方法

class Alipay(Payment):
    def pay(self,money):
        print('使用支付宝支付了%s元'%money)

class QQpay(Payment):
    def pay(self,money):
        print('使用qq支付了%s元'%money)

class Wechatpay(Payment):
    # def pay(self,money):
    #     print('使用微信支付了%s元'%money)
    def recharge(self):pass

def pay(a,money):
    a.pay(money)

a = Alipay()
a.pay(100)
pay(a,100)    # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
q = QQpay()
q.pay(100)
pay(q,100)
w = Wechatpay()
pay(w,100)   # 到用的时候才会报错



# 抽象类和接口类做的事情 :建立规范
# 制定一个类的metaclass是ABCMeta,
# 那么这个类就变成了一个抽象类(接口类)
# 这个类的主要功能就是建立一个规范    

   ③ 、 类:具有相同特征的一类东西(人、狗、老虎)

b、缺点:可控性差,无法向面向进度的次序设计流水生产线式的可以很精准的猜测问题的拍卖流程与结果,面向对象的顺序一旦先河就有指标之间的竞相消除难题。

  

   ④ 、对象/实例:具体的某二个事物(隔壁阿花、楼下旺财)

③ 、 类:具有同样特征的一类东西(人、狗、老虎)

  2.
进行中,继承的率先种意义意义并不非常大,甚至常常是损害的。因为它使得子类与基

   五 、实例化:类——>对象的长河

四 、对象/实例:具体的某2个东西(隔壁阿花、楼下旺财)

   类出现强耦合。

   6、在python中,用变量表示特征,用函数表示技术,由此具有同等特征和技艺的一类东西就是‘类’,

⑤ 、实例化:类——>对象的进度

     1>  继承的第二种意义分外重庆大学。它又叫“接口继承”。
    
 接口继承实质上是讲求“做出三个上佳的虚幻,这一个抽象规定了1个合营接口,使得外

   柒 、对象是则是这一类东西中现实的2个

面向对象进阶,Python之面向对象总计。六 、在python中,用变量表示特征,用函数表示技术,由此具有同等特征和技艺的一类东西便是‘类’,

   部调用者无需关切具体细节,可并排的拍卖实现了一定接口的有着指标”——那在

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法,也叫动态属性
        print("person is walking...")

class 类名:
    类属性 = None
    def __init__(self,对象属性):
        self.对象属性 = 对象属性

    def 方法名(self):
        pass

实例 = 类名(10)
实例.方法名()

⑦ 、对象是则是这一类东西中切实的3个

   程序设计上,叫做归一化。

    ⑧ 、类的二种功效:属性引用和实例化

class Person: #概念1个人类

   归一化使得高层的外表使用者能够不加区分的拍卖全部接口兼容的靶子集合——就好

    ⑨ 、属性引用(类名.属性)

role = ‘person’ #人的剧中人物属性都以人

   象linux的泛文件概念一样,全数东西都可以当文件处理,不必关注它是内部存款和储蓄器、磁盘、

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

def walk(self): #人都得以走路,也正是有七个行动方法,也叫动态属性

   互连网大概荧屏(当然,对底层设计者,当然也足以分别出“字符设备”和“块设备”,然后

   
十 、例化:类名加括号正是实例化,会活动触发__init__函数的周转,能够用它来为每一种实例定制本人的表征

print(“person is walking…”)

   做出针对性的筹划:细致到什么水平,视需要而定)。

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def __init__(self,name):
        self.name = name  # 每一个角色都有自己的昵称;

    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

class 类名:

 

    11、

类属性 = None def __init__(self,对象属性):

   2>
注意:在python中常有就从不2个称为interface的重中之重字,上面的代码只是看起来像

类名
    类名.类属性
   类名.方法名

实例 = 类名(参数,参数)  #实例就是对象

实例
    实例.方法名()
   实例.对象属性

实例增加属性
实例.新的属性名 = 1000
print(实例.新的属性名)

self.对象属性 = 对象属性 def 方法名(self): pass实例 = 类名(10)

      接口,其实并没有起到接口的功效,子类完全能够不用去实现接口 

   12、关于self

实例.方法名()

 

self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字.

对象/实例只有一种作用:属性引用

class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

dir(类) #返回类中的所有名字列表
isinstance(对象,类) #判断对象是否为类的实例
print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
print(Person.__module__)  #person类所在的模块
print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名

美高梅开户网址 4

   3>
 接口提取了一群类一起的函数,能够把接口当做1个函数的聚集。
然后让子

     1三 、类命名空间与对象、实例的命名空间

八 、类的两种功能:属性引用和实例化

    类去达成接口中的函数。
这么做的意思在于归一化,什么叫归一化,就是只

         
 a、常见一个类就会创立2个类的名目空间,用来储存类中定义的持盛名字,这个名字改为类的天性

九 、属性引用(类名.属性)

    如果依据同三个接口达成的类,那么富有的这个类产生的靶子在行使时,从用

           b、而类有三种个性:静态属性和动态属性

class Person: #概念三个生人

    法上的话都同一。
归一化,让使用者无需关切对象的类是什么,只必要的明亮

  •  静态属性就是直接在类中定义的变量
  • 动态属性就是概念在类中的方法

role = ‘person’ #人的角色属性都以人

    这个目的都具备某个意义就足以了,那一点都不小地下落了使用者的行使难度。

始建3个对象/实例就会成立叁个目的/实例的称谓空间,存放对象/实例的名字,称为对象/实例的属性

def walk(self): #人都得以走路,也正是有三个行动方法

    如:大家定义2个动物接口,接口里定义了有跑、吃、呼吸等接口函数,那样老

姿容对象的组合用法:

print(“person is walking…”)print(Person.role)
#翻看人的role属性print(Person.walk)
#引用人的行动方法,注意,那里不是在调用。小编推荐1个学Python的求学裙【五八八,零九零,九四二】,无论你是大咖依旧小白,是想转行依旧想入行都能够来打听一起前进一起读书!裙内有诸多干货和技巧分享

    鼠的类去贯彻了该接口,松鼠的类也去落到实处了该接口,由双方分别发生3头老鼠

结缘指的是,在三个类中以其它2个类的对象作为数据属性,称为类的组

⑩ 、例化:类名加括号便是实例化,会活动触发__init__函数的运作,能够用它来为每种实例定制本身的特点

    和二只松鼠送到你眼下,即正是你分别不到底哪只是什么鼠你一定领会他们都会

列子:

class Person: #概念二个生人

    跑,都会吃,都能呼吸。
再比如:咱们有1个汽车接口,里面定义了小车全部

美高梅开户网址 5美高梅开户网址 6

role = ‘person’ #人的脚色属性皆以人

    的效率,然后由本田小车的类,奥迪小车的类,三菱小车的类,他们都落实了汽

from  math  import pi
class Circular:
    def __init__(self,radius):
        self.radius=radius
    def area(self):
        return self.radius **2 * pi
    def perimeter(self):
        return 2 * self.radius * pi
circu=Circular(10)
print(circu.area())
print(circu.perimeter())

def __init__(self,name):

    车接口,这样就好办了,大家只必要学会了怎么开小车,那么不论本田(Honda),还是

圆的周长与面积

self.name = name # 每贰个剧中人物都有本身的外号;

    奥迪,依旧公众大家都会开了,开的时候根本无需关心小编开的是哪一种车,操作

     1④ 、面向对象的三大特征

def walk(self): #人都足以走路,也正是有三个行进方法

    手法(函数调用)都一致

           a、继承

print(“person is walking…”)print(Person.role)
#翻看人的role属性print(Person.walk)
#引用人的行动方法,注意,那里不是在调用

 

class Animal:      #父类  基类  超类
    def __init__(self,name,life_value,aggr):
        self.name = name
        self.life_value = life_value
        self.aggr = aggr


class Person(Animal):  #子类  派生类
    pass

class Dog(Animal): #子类  派生类
    pass

egg = Person('egon',1000,50)
print(egg.name)
print(egg.aggr

11、

二,  抽象类

       

类名

  1. 哪些是抽象类

python2
class Dad:  #经典类
class Dag(object)  #新式类

python3
class Dad  ==  class Dag(object) #新式类

类名.类属性

*     *
与java一样,python也有抽象类的定义然则同样须要依靠模块完成,抽象类是三个卓殊

              壹 、继承的语法

类名.方法名

   的类,它的奇异之处在于只可以被持续,无法被实例化

 class 类名(父类名):
      想在子类中实现调用父类的方法
      在类内 ——super(子类名,self).方法名()
      在类外面 ——super(子类名,对象名).方法名()
      如果不指定继承的父类,默认继承object
      子类可以使用父类的所有属性和方法
      如果子类有自己的方法就执行自己的的
      如果是子类没有的方法就执行父类的
      如果子类父类都没有这个方法就报错

继承、抽象、派生
继承 是从大范围到小范围
抽象 小范围到大范围
派生 就是在父类的基础上又产生子类——派生类
        父类里没有的 但子类有的 ——派生方法
        派生属性
方法的重写
    父类里有的方法,在子类里重新实现

 

实例 = 类名(参数,参数) #实例正是指标实例

 

              ② 、继承的二种用途:                

实例.方法名()

  2. 为什么要有抽象类

                 
b:继承基类的不二法门,并且做出自身的改观如故扩张(代码重用)***
  ***

实例.对象属性

   如果说类是从一堆对象中抽取相同的剧情而来的,那么抽象类是从一堆中抽取相同

                 
a:注明某些子类兼容于某基类,定义贰个接口类Interface,接口类中定义

实例扩张品质

   的始末而来的,内容包涵数据属性和函数属性。

                       
 **
 了一些接口名(便是函数名)且并未实现接口的效益,子类继承接口类,并且达成接口中的效率**

实例.新的性质名 = 一千print(实例.新的属性名)

   
比如我们有香蕉的类,有苹果的类,有桃子的类,从那么些类抽取相同的内容就是水果那

           b、封装

12、关于self

   个抽象的类,你吃水果时,要么是吃2个具体的香蕉,要么是吃一个有血有肉的桃子,你永远

                  1、优点:

self:在实例化时自动将对象/实例本人传给__init__的第③个参数,你也足以给她起分其他名字.

   不能够吃到3个称呼水果的东西。

                              a、将转变隔绝

目的/实例只有一种成效:属性引用

     
从统筹角度去看,如若类是从现实对象抽象而来的,那么抽象类便是基于类华而不实而来的。

                              b、封装使用

class 类名: def __init__(self,参数1,参数2):

   
从实现角度来看,抽象类与普通类的分化之处在于:抽象类中有抽象方法,该类不可能被

                              c、升高复用性

self.对象的质量1 = 参数1

   实例化,只可以被接二连三,且子类必须贯彻抽象方法。那或多或少与接口有点类似,但骨子里是不

                              d、提升安全性

self.对象的习性2 = 参数2 def 方法名(self):pass

   同的.

                  二 、封装原则:

def 方法名2(self):pass对象名 = 类名(1,2)
#目的即是实例,代表3个切实可行的事物

 

                              a、将不须要对外提供的剧情都躲藏起来

#类名() : 类名+括号正是实例化2个类,也等于调用了__init__方法

 

                              b、把质量都藏匿起来提供公共措施对其访问

#括号里传参数,参数不须要传self,其余与init中的形参一一对应

  2. 抽象类与接口类

                  ③ 、私有变量和私家方法

#结果回到贰个对象目的名.对象的性子1 #翻看对象的性质,间接用
对象名.属性名 即可对象名.方法名() #调用类中的方法,间接用
对象名.方法名() 即可

   抽象类的本质依然类,指的是一组类的相似性,包蕴数据属性(如all_type)和函数属

                             
a、在python中用双涂鸦的起头的的方法降属性隐藏起来(设置个人的)

美高梅开户网址 7

   性(如read、write),而接口只强调函数属性的相似性

property属性

dir(类) #归来类中的所盛名字列表isinstance(对象,类)
#看清目的是还是不是为类的实例print(Person.__dict__) # 重回贰个字典
key是属性名,value是属性值print(Person.__module__)
#person类所在的模块print(Person.__name__,type(Person.__name__))
#字符串数据类型的类名

   抽象类是1个在乎类和接口直接的2个概念,同时具备类和接口的片段天性,可以

property是一种特有的性质,访问它时会执行一段功用(函数)然后再次回到值

1三 、类命名空间与对象、实例的命名空间

   用来贯彻归一化设计 

  

a、常见1个类就会创设四个类的名称空间,用来储存类中定义的有所名字,这么些名字改为类的品质

   

         
 c、多态:”多态指的是一类东西有种种形象(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生进行的是放学操作,即使双方音信一点差异也没有于,不过执行的机能分歧)

b、而类有二种个性:静态属性和动态属性

  3.
在python中,并不曾接口类那种事物,即使不通过专门的模块定义接口,大家也应有有

                   多态指的是:一类东西有多样状态

静态属性正是直接在类中定义的变量

   一些为主的定义。

python自带多态:

  多态:同一类事物的多种状态

  python里处处都是多态,只是我们一般发现不了

  操作的时候不需要关心这个对象的数据类型,你只要用就行了

动态属性就是概念在类中的方法

 

 

成立一个对象/实例就会成立1个对象/实例的称号空间,存放对象/实例的名字,称为对象/实例的特性

  4. 多三番五次难点

    15、反射     

长相对象的组成用法:

    在继续抽象类的长河中,大家应有尽量幸免多一连;
    而在此起彼伏接口的时候,大家反而鼓励你来多一连接口

        1、反射:能够用字符串的章程去做客对象的属性,调用对象的措施(可是不能够去访问方法),python中总体皆对象,都足以行使反射。

组合指的是,在二个类中以别的1个类的对象作为数据属性,称为类的组

 
  
  5. 接口隔离原则:
  使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。

        二 、反射有各种办法:

列子:

 

             
 hasattr:hasattr(object,name)判断3个对象是否有name属性也许name方法。有就回去True,没有就赶回False

圆的周长与面积

  6. 方法的贯彻

             
getattr:获取对象的性质或然措施,假如存在则打字与印刷出来。hasattr和getattr配套使用

1肆 、面向对象的三大特色

   在抽象类中,大家得以对有的虚幻方法做出基础完结;
   而在接口类中,任何形式都只是一种标准,具体的效益须求子类实现

                
必要留意的是,固然回去的是目的的办法,再次来到出来的是指标的内部存款和储蓄器地址,借使急需周转这几个主意,能够在末端添加一对()

a、继承

 

               setattr:给指标的质量赋值,若属性不设有,先创制后赋值

class Animal: #父类 基类 超类

三, 多态

               delattr:删除该目的钦点的贰个脾性

def __init__(self,name,life_value,aggr):

 

          a、内置方法:isinstance和issubclass

self.name = name

  1.
Pyhon不支持Java和C#这一类强类型语言中多态的写法,不过原生多态,其Python崇尚

               isinstance(obj,cls)检查是或不是obj是不是是类 cls
的对象

self.life_value = life_value

   “鸭子类型”

class Foo:
    pass
class Son(Foo):
    pass
s=Son()

print(isinstance(s,Son))

self.aggr = aggrclass Person(Animal): #子类 派生类

class F1:
    pass


class S1(F1):

    def show(self):
        print 'S1.show'


class S2(F1):

    def show(self):
        print 'S2.show'


# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
    """Func函数需要接收一个F1类型或者F1子类的类型"""

    print obj.show()

s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

Python伪代码实现Java或C#的多态

Python伪代码实现java C#多态

#鸭子类型

class F1:
    pass


class S1(F1):

    def show(self):
        print 'S1.show'


class S2(F1):

    def show(self):
        print 'S2.show'

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj) 

#都有同样的方法,使用上类似,具有统一化设计思想,就叫鸭子类型

        b、内置方法:issubclass(sub, super)检查sub类是还是不是是
super 类的派生类 

passclass Dog(Animal): #子类 派生类

 

class Foo(object):
    pass

class Bar(Foo):
    pass

issubclass(Bar, Foo)

passegg = Person(‘egon’,1000,50)print(egg.name)print(egg.aggr

 

 

python2class Dad: #经典类class Dag(object) #新式类python3class Dad ==
class Dag(object) #新式类

四, 封装

     
 c、python面向对象中的反射:通过字符串的款型操作对象相关的性质,python中整整事物都以指标(都得以用反射)

一 、继承的语法

 

检查是否含有某属性---hasattr 返回布尔值
获取属性---getattr   没有就会报错
设置属性---setattr
删除属性---delattr

class 类名(父类名): 想在子类中贯彻调用父类的法子 在类内
——super(子类名,self).方法名() 在类外面 ——super(子类名,对象名).方法名()
要是不点名继承的父类,暗许继承object 子类能够应用父类的富有属性和方式假诺子类有谈得来的章程就执行自身的的 如若是子类没有的措施就实施父类的
假使子类父类都不曾那个主意就报错

 

       d、内置方法:__del__

继承、抽象、派生

  1.
打包,顾名思义正是将内容封装到某些地点,以往再去调用被封装在某处的始末。

析构方法,当对象在内部存储器中被保释时,自动触发执行。

继承 是从大范围到小范围

   所以,在动用面向对象的封装天性时,必要:

注:此方式一般不要定义,因为Python是一门高级语言,程序员在行使时无需关怀内部存款和储蓄器的分红和刑满释放,因为此工作都是付出Python解释器来实施,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

虚幻 小范围到大范围

    •  将内容封装到某处
    •  从某处调用被打包的内容
class Foo:
    def __del__(self):
        print('fgs')
f=Foo()
print(123)
print(123)
del f
print(123)
print(123)
print(123)

派生 正是在父类的基本功上又生出子类——派生类

  

 

父类里不曾的 但子类有的 ——派生方法

  2. 将内容封装到某处

     e、内置方法:item系列

派生属性

美高梅开户网址 8

__getitem__\__setitem__\__delitem__

    __new__

class A:
    def __init__(self):  #有一个方法在帮你创造self
        print('in init function')
        self.x=1
    def __new__(cls, *args, **kwargs):
        print('in init funct')
        return object.__new__(A,*args,**kwargs)
a=A()

     f、__str__和__repr__变动目的的字符串展现

美高梅开户网址 9美高梅开户网址 10

class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4     def __repr__(self):
 5         return 'obj in str'  #这里只能是return
 6     # def __str__(self):
 7     #     return '%s obj in str'%self.name
 8 f = Foo('egon')
 9 print(f)  #优先执行__str__里面的内容
10 # 那么你是不是据地__repr__没用呢?
11 # print('%s'%f)  #执行的是__str__里面的返回值
12 # print('%r'%f)  #执行的是__repr__里面的返回值
13 print('==============')
14 print(str(f))  #当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
15 print(repr(f))
16 #1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
17 # 2.当__str__没有被实现的时候,就会调用__repr__方法
18 # 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
19 # 4.不管是在字符串格式化的时候还是在打印对象的时候,
20 # __repr__方法都可以作为__str__方法的替补,但反之则不行
21 # 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个:先实现__repr__

__str__,__repr__

    1⑤ 、内置方法

           a、静态方法和类方式

             
 壹 、类措施:有个默许参数cls,并且能够一向用类名去调用,能够与类属性交互(也正是能够应用类属性)

             
 二 、静态方法:让类里的措施间接被类调用,就像符合规律调用函数一样

           b、类形式和静态方法的相同点:都能够间接被类调用,不要求实例化

           c、类措施和静态方法的分歧点:

          类方法必须有3个cls参数表示那个类,能够利用类属性

           静态方法不须要参数

           d、绑定方法:分为普通方法和类措施

     普通方法:默许有几个self对象传进来,并且只可以被对象调用——-绑定到目的

     类方法:暗许有1个cls对象传进来,并且能够被类和对象(不推荐)调用—–绑定到类

           
e、非绑定方法:静态方法:没有设置私下认可参数,并且可以被类和对象(不推荐)调用—–非绑定

    1⑥ 、接口类与抽象类

             a、 接口类:(在抽象类的根底上)

         在python中,暗中同意是未曾接口类的           

                    接口类无法被实例化(要是实例化会报错)

          接口类中的方法不可能被完毕

接口也就是做约束,让下面的类的方法都按照接口类中给出的方法去定义。如果接口类里面有的方法类里面没有,那么那个类就不能被实例化。(字面理解)

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

           b、抽象类

在python中,默认是有的

    父类的方法,子类必须实现

    抽象类(父类)的方法可以被实现

抽象类和接口类的区别:接口类不能实现方法,抽象类可以实现方法里面的内容

抽象类和接口类的相同点:都是用来做约束的,都不能被实例化

抽象类和接口类的使用:

  当几个子类的父类有相同的功能需要被实现的时候就用抽象类

  当几个子类有相同的功能,但是实现各不相同的时候就用接口类

 

方法的重写

 

父类里部分艺术,在子类里再度完结

   self 是三个格局参数,当执行 obj1 = Foo(‘wupeiqi’, 18 ) 时,self
等于 obj1

② 、继承的三种用途:

                                   当执行 obj2 = Foo(‘alex’, 78 )
时,self 等于 obj2

b:继承基类的措施,并且做出自个儿的改变或许扩充(代码重用)

 

a:注解有个别子类包容于某基类,定义一个接口类Interface,接口类中定义

  所以,内容实在被包裹到了对象 obj1 和 obj2 中,每种对象中都有 name 和
age 属性,

了有个别接口名(正是函数名)且从未实现接口的功效,子类继承接口类,并且达成接口中的成效

  在内存里好像于下图来保存。

b、封装

 

1、优点:

美高梅开户网址 11

a、将扭转隔开分离

 

b、封装使用

  3. 第3步:从某处调用被包裹的内容

c、进步复用性

   调用被卷入的始末时,有三种景况:

d、升高安全性

    • 因此对象直接调用
    • 经过self直接调用

② 、封装原则:

  1> 通过对象直接调用被打包的剧情

a、将不须要对外提供的始末都隐藏起来

   上海教室展现了对象 obj1 和 obj2
在内部存储器中保存的点子,依据保存格式能够如此调用被封

b、把质量都掩藏起来提供公共艺术对其访问

   装的始末:对象.属性名

三 、私有变量和私家方法

class Foo:

    def __init__(self, name, age):
        self.name = name
        self.age = age

obj1 = Foo('wupeiqi', 18)
print obj1.name    # 直接调用obj1对象的name属性
print obj1.age     # 直接调用obj1对象的age属性

obj2 = Foo('alex', 73)
print obj2.name    # 直接调用obj2对象的name属性
print obj2.age     # 直接调用obj2对象的age属性

a、在python中用双写道的起头的的章程降属性隐藏起来(设置个人的)

 

property属性

 

property是一种特殊的性情,访问它时会执行一段成效(函数)然后重返值

经过self直接调用被卷入的剧情

c、多态:”多态指的是一类东西有多样造型(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生实施的是放学操作,即使双方消息无异于,可是实施的意义不一致)

   执行类中的方法时,要求经过self直接调用被卷入的始末

多态指的是:一类玩意儿有八种场合

class Foo:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def detail(self):
        print self.name
        print self.age

obj1 = Foo('wupeiqi', 18)
obj1.detail()  # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18

obj2 = Foo('alex', 73)
obj2.detail()  # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78

python自带多态:

 

多态:同一类东西的有余景况

  4.
总结,对于面向对象的包装来说,其实就是运用构造方法将内容封装到
对象

python里随地都以多态,只是大家一般发现不了

   中,然后经过对象直接大概self直接获取被卷入的情节

操作的时候不须要关注这几个目的的数据类型,你一旦用就行了

 

15、反射

 

一 、反射:能够用字符串的章程去做客对象的属性,调用对象的措施(但是不能够去访问方法),python中一切皆对象,都得以利用反射。

五, 封装性与扩张性

二 、反射有七种格局:

  1.
封装在于分明区分内外,使得类完结者能够修改封装内的事物而不影响外部调用者的

hasattr:hasattr(object,name)判断一个对象是不是有name属性或许name方法。有就重返True,没有就回来False

   代码;而外部使用者只知道1个接口(函数),只要接(函数)名、参数不变,使用者的

getattr:获取对象的习性只怕措施,倘使存在则打字与印刷出来。hasattr和getattr配套使用

   代码永远无需改变。那就提供2个精美的合营基础——恐怕说,只要接那么些基础约定

须要留意的是,如若回去的是指标的法门,再次回到出来的是指标的内部存款和储蓄器地址,如若急需周转那个主意,能够在背后添加一对()

   不变,则代码改变不足为虑.

setattr:给指标的品质赋值,若属性不设有,先创制后赋值

#类的设计者
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    def tell_area(self): #对外提供的接口,隐藏了内部的实现细节,此时我们想求的是面积
        return self.__width * self.__length


#使用者
>>> r1=Room('卧室','egon',20,20,20)
>>> r1.tell_area() #使用者调用接口tell_area


#类的设计者,轻松的扩展了功能,而类的使用者完全不需要改变自己的代码
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    def tell_area(self): #对外提供的接口,隐藏内部实现,此时我们想求的是体积,内部逻辑变了,只需求修该下列一行就可以很简答的实现,而且外部调用感知不到,仍然使用该方法,但是功能已经变了
        return self.__width * self.__length * self.__high


#对于仍然在使用tell_area接口的人来说,根本无需改动自己的代码,就可以用上新功能
>>> r1.tell_area()

delattr:删除该指标钦赐的三个属性

 

a、内置方法:isinstance和issubclass

 

isinstance(obj,cls)检查是不是obj是或不是是类 cls 的目的

六, 面向对象结构分析

class Foo: passclass Son(Foo): passs=Son()print(isinstance(s,Son))

  

b、内置方法:issubclass(sub, super)检查sub类是不是是 super 类的派生类

  1.  如上边的图所示:面向对象全部大约分两块区域:

class Foo(object): pass

 

class Bar(Foo): pass

美高梅开户网址 12

issubclass(Bar, Foo)

  那么每一种大区域又足以分为八个小片段

c、python面向对象中的反射:通过字符串的款型操作对象相关的性质,python中总体育赛事物都以目的(都得以用反射)

class A:

    company_name = '老男孩教育'  # 静态变量(静态字段)
    __iphone = '1353333xxxx'  # 私有静态变量(私有静态字段)


    def __init__(self,name,age): #普通方法(构造方法)

        self.name = name  #对象属性(普通字段)
        self.__age = age  # 私有对象属性(私有普通字段)

    def func1(self):  # 普通方法
        pass

    def __func(self): #私有方法
        print(666)


    @classmethod  # 类方法
    def class_func(cls):
        """ 定义类方法,至少有一个cls参数 """
        print('类方法')

    @staticmethod  #静态方法
    def static_func():
        """ 定义静态方法 ,无默认参数"""
        print('静态方法')

    @property  # 属性
    def prop(self):
        pass

检查是还是不是带有某属性—hasattr 重临布尔值

 

取得属性—getattr 没有就会报错

  2. 面向对象的公有私有 

安装属性—setattr

   1>  对于每叁个类的分子而言都有三种格局:

删除属性—delattr

    •  公有成员,在别的地点都能访问
    •  私有成员,只有在类的个中才能格局

d、内置方法:__del__

 

析构方法,当对象在内部存款和储蓄器中被假释时,自动触发执行。

      2> 私有成员和国有成员的走访限制不一样:

注:此办法一般不要定义,因为Python是一门高级语言,程序员在选取时无需关心内部存款和储蓄器的分红和假释,因为此工作都以付诸Python解释器来执行,所以,析构函数的调用是由解释器在展开垃圾回收时自动触发执行的。

    静态字段(静态变量)

class Foo: def __del__(self): print(‘fgs’)

    •  公有静态字段:类能够访问;类内部能够访问;派生类中得以访问
    •  私有静态字段:仅类内部能够访问;

    class C:

    name = "公有静态字段"
    
    def func(self):
        print C.name
    

    class D(C):

    def show(self):
        print C.name
    

f=Foo()print(123)print(123)del fprint(123)print(123)print(123)

C.name         # 类访问

obj = C()
obj.func()     # 类内部可以访问

obj_son = D()
obj_son.show() # 派生类中可以访问

e、内置方法:item连串

 

__getitem__\__setitem__\__delitem__

class C:

    __name = "私有静态字段"

    def func(self):
        print C.__name

class D(C):

    def show(self):
        print C.__name


C.__name       # 不可在外部访问

obj = C()
obj.__name  # 不可在外部访问
obj.func()     # 类内部可以访问   

obj_son = D()
obj_son.show() #不可在派生类中可以访问  

__new__

 

class A: def __init__(self): #有一个方法在帮您成立self

 

print(‘in init function’)

  3. 属性

self.x=1 def __new__(cls, *args, **kwargs): print(‘in init
funct’) return object.__new__(A,*args,**kwargs)

*  1>
property是
一*种特殊的特性,访问它时会执行一段效率(函数)然后重临值

a=A()

例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)

成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
  体质指数(BMI)=体重(kg)÷身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86

class People:
    def __init__(self,name,weight,height):
        self.name=name
        self.weight=weight
        self.height=height
    @property
    def bmi(self):
        return self.weight / (self.height**2)

p1=People('egon',75,1.85)
print(p1.bmi)

f、__str__和__repr__变更指标的字符串突显

 

__str__,__repr__

  2> 为啥要用property

1伍 、内置方法

  将贰个类的函数定义成特色现在,对象再去行使的时候obj.name,根本不可能察觉自个儿的name

a、静态方法和类措施

  是履行了一个函数然后总计出来的,那种特征的选择办法遵从了统一访问的尺码

壹 、类格局:有个暗许参数cls,并且能够直接用类名去调用,可以与类属性交互(也正是足以动用类属性)

  由于新型类中保有二种访问方式,大家能够依据他们多少个属性的拜会特点,分别将八个方

② 、静态方法:让类里的不二法门直接被类调用,就好像寻常调用函数一样

  法定义为对同叁个属性:获取、修改、删除

b、类措施和静态方法的相同点:都足以直接被类调用,不须求实例化

class Goods(object):

    def __init__(self):
        # 原价
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    @property    #将该方法伪装成一个属性,在代码级别上没有本质的提升,但是让其看起来很合理.
    def price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter  #固定写法, 其中伪装的函数属性名,要修改的方法属性名和 @属性名.setter 要一致
    def price(self, value):
        self.original_price = value

    @price.deltter
    def price(self, value):
        del self.original_price

obj = Goods()
obj.price         # 获取商品价格
obj.price = 200   # 修改商品原价
del obj.price     # 删除商品原价

c、类情势和静态方法的区别点:

 

类形式必须有三个cls参数表示那几个类,能够行使类属性

  4. 类方法:  @classmethod

静态方法不需求参数

    应用场景:

d、绑定方法:分为一般方法和类措施

     (1), 类中稍微措施是不须要传入对象,不要对象的漫天事物

一般说来方法:暗许有一个self对象传进来,并且只好被对象调用——-绑定到对象

     (2), 对类中的静态变量进行更改

类措施:暗许有多少个cls对象传进来,并且能够被类和目标(不推荐)调用—–绑定到类

     (3),
继承中,父类获得子类的上空(子类类名调用,类名传给cls,父类中则会获得子类地址)

e、非绑定方法:静态方法:没有安装默许参数,并且能够被类和指标(不引进)调用—–非绑定

      

1陆 、接口类与抽象类

class A:
    def func(self):# 普通方法
        print(self)

    @classmethod    #类方法
    def func1(cls)
        print(cls)


a = A()
a.func()    #对象调用的普通方法
A.func(a)    #类名调用的普通方法

A.func1()  #类方法:通过类名调用的方法,类方法中第一个参数约定俗成是 cls
                        #python自动将类名(类空间)传给 cls    

a、 接口类:(在抽象类的底蕴上)

  注意:对象调用类方法,cls 获得的是类本人

在python中,暗中认可是从未有过接口类的

  

接口类不可能被实例化(借使实例化会报错)

  5. 静态方法:  @staticmethod

接口类中的方法不可能被达成

    优点: 1. 代码块清晰  2. 充实复用性  

接口也正是做约束,让上边包车型大巴类的办法都遵照接口类中付出的点子去定义。借使接口类里面有个别方法类里面没有,那么那些类就无法被实例化。(字面精晓)

class  A :
    @staticmethod
    def func(self):
        print(33)

A.func()
#结果: 33

继续的第二种意义分外主要。它又叫“接口继承”。

 

接口继承实质上是要求“做出三个精粹的空洞,这几个抽象规定了一个十分接口,使得外部调用者无需关心具体细节,可并排的处理达成了一定接口的全数目的”——那在先后设计上,叫做归一化。

 

b、抽象类

七,  isinstance与issubclass

在python中,暗中同意是有的

isinstance(obj,cls) 检查obj是或不是是类 cls 的目的

父类的法门,子类必须兑现

class A: pass

class B(A): pass

obj = B()
print(isinstance(obj,B))  #True  判断对象所属关系,包含所有继承关系,只要是
print(isinstance(obj,str))  #True
print(type(obj) is str)     #不包含继承系,只管一层

抽象类(父类)的艺术能够被完成

 

抽象类和接口类的区分:接口类不能兑现情势,抽象类能够实现形式里面包车型大巴始末

issubclass(sub, super)检查sub类是或不是是 super 类的派生类

抽象类和接口类的相同点:都是用来做约束的,都不能够被实例化

class A: pass

class B(A): pass

abj = B()

print(issubclass(B,A)) #True  #判断类的继承关系

抽象类和接口类的利用:

 

当多少个子类的父类有同等的作用须要被完结的时候就用抽象类

八,反射

当多少个子类有同一的效益,不过落成各不一致的时候就用接口类

   getattr  hasattr  setattr  delattr

美高梅开户网址 13

    hasattr : 判断类中是不是留存要调用的变量或艺术

    getattr : 可与hasattr 结合使用,若hasattr判断存在,则实施 getattr.

    getattr (空间名 , ‘空间内的变量’)  可以看作是对
空间名.空间内的变量 举行交换

 

  1.
python面向对象中的反射:通过字符串数据类型的变量名来访问那些变量的值。python

   中的一切事物都以指标(都得以应用反射)

    类名反射 : 静态属性  类方法  静态方法

    对象反射 : 对象属性  方法  

    模块  :  模块中的方法

    自身模块中:

      import sys   mymodule =
[‘__main__’]   getattr(mymodule.’变量名’)

  

  2. 行使对象来反光:

class Foo:
    f = '类的静态变量'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say_hi(self):
        print('hi,%s'%self.name)

obj=Foo('egon',73)

#检测是否含有某属性  若能找到返回True,找不到返回False
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))

#获取属性
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))

#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)

 

  3. 实用类来反光:

class Foo(object):

    staticField = "old boy"

    def __init__(self):
        self.name = 'wupeiqi'

    def func(self):
        return 'func'

    @staticmethod
    def bar():
        return 'bar'

print (getattr(Foo, 'staticField'))#调用静态字段 结果为 : old boy
print (getattr(Foo, 'func'))#调用函数,打印的是内存地址
print (getattr(Foo, 'bar')())#调用静态函数,结果为 : bar

美高梅开户网址 14

 

  4. 对当下模块反射

  首先找到自身日前文件所在的命名空间

  

import sys

def s1():
    print('s1')

def s2():
    print('s2')

 this_module = sys.modules[__name__]#获取当前模块的空间地址

hasattr(this_module, 's2')
getattr(this_module, 's2')

 

  5. 对任何模块反射

import sys


def s1():
    print('s1')


def s2():
    print('s2')

this_module = sys.modules[__name__] 

hasattr(this_module, 's1') 
getattr(this_module, 's2')

 美高梅开户网址 15

 

九, 内置方法(双下划线办法,魔术点子,类中的特殊措施)

     __名字__  类中的每3个双下划线办法都有她协调的特殊含义

   内置函数和松手方法是有密切挂钩的

   全数的停放方法不需求再外部直接调用,而是用一些别的的松手函数或新鲜的语法来机关

   触发那么些内置方法

  1. __call__  对象前面加括号,触发执行。

     注:__init__艺术的实践是由创设对象触发的,即:对象 = 类名()
;而对于 __call__ 方法的

   执行是由对象后加括号触发的,即:对象() 或许 类()()

class Foo:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):

        print('__call__')


obj = Foo() # 执行 __init__
obj()       # 执行 __call__

 

  2. __len__

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __len__(self):
        return len(self.__dict__)  #__len__方法return的值就是len函数的返回值
a = A()
print(len(a))  #len(obj)相当于调用了这个对象的__len__方法,如果obj对象没有__len__方法
            那么len函数就会报错

 

  3.__new__

   构造方法  :__new__

   开首化方法: __init__

  1>  面向对象在实例化时:

   1.开发三个空中,属于对象的  2.
把指标空间传给self,执行init,封装属性

   3. 将以此目的空间重临给调用者

  2>  __new__开拓空间,重回给self,
在实例化对象之后,__init__之前,执行__new__方法.

class SIngle:
        def __new__(cls,*args,**kwargs):
                print('在new方法里')
                obj=object.__new__(cls)
                print('在new方法里',obj)
                return  obj
         def __init__(self):
               print('在init方法里',self)

obj=SIngle()

  3> 单例类

   倘若三个类,从头到尾只可以有3个实例,表达只开辟一块属于对象的空中,那么这几个类正是一

    个单例类

class A:
    __instance = None
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:#不空则执行下面程序,若为空则不执行,即只开辟一次空间
           cls.__instance=object.__new__(cls)#调用object类中的__new__方法,开辟一个空间
        return cls.__instance#返回空间地址
    def __init__(self,name,age):#把空间地址传给self
        self.name=name
        self.age=age

s1=A('he',23)
s2=A('ha',30)#返回的还是第一次开辟的空间,只是s2的属性将会覆盖原来的属性
print(s1.name)
print(s2.name)
#结果:  ha ha

 

  4.  __str__

  即便二个类中定义了__str__措施,那么在打字与印刷 对象
时,私下认可输出该办法的回到值.

class A:
    def __init__(self):
        pass
    def __str__(self):
        return '白'
a = A()
print(a)    #相当于调用a的__str__方法
print('%s' % a)#相当于执行a.__str__方法

另:print(str(obj))  #内置的数据类型相当于执行obj.__str__方法

 

  5. __repr__ :

    1> __repr__ 是__美高梅开户网址 ,str
__的备胎,如果有__str__主意,那么 print, %s,  str 都去执行str方法,

      并且应用str的重回值;要是没有__str__,那么print, %s,
str都会履行repr

      repr(obj)  %r 

     2>
在子类中央银行使__str__,先找子类的__str__,没有的话要向上找,只要父类不是object,就

      执行父类的__str__,可是只要出了object之外的父类都没有__str__方法,就举办子类的

      __repr__措施,假诺子类也尚未,还要升高继续找父类中的__repr__办法,一贯找不到

      再执行object类中的__str__的方法

class A:
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return '**%s**' % self.name
    def __repr__(self):
        return self.name
a = A('alex')
print(a)
print(str(a),repr(a))
print('%s , %r' % (a,a))


#注意:
# %r : 把 repr 的返回结果给 %r;
# %s :把 str 的返回结果给 %s

 

  6. getattr(object, name[default])  

  获取对象object的质量大概措施,要是存在打字与印刷出来,假若不设有,打字与印刷出默许值,暗许值

  可选。供给小心的是,倘使是回到的目的的主意,再次来到的是艺术的内部存款和储蓄器地址,倘使要求周转

  这么些主意,能够在背后添加一对括号。

>>> class test():
...     name="xiaohua"
...     def run(self):
...             return "HelloWord"
...
>>> t=test()
>>> getattr(t, "name") #获取name属性,存在就打印出来。
'xiaohua'
>>> getattr(t, "run")  #获取run方法,存在就打印出方法的内存地址。
<bound method test.run of <__main__.test instance at 0x0269C878>>
>>> getattr(t, "run")()  #获取run方法,后面加括号可以将这个方法运行。
'HelloWord'
>>> getattr(t, "age")  #获取一个不存在的属性。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: test instance has no attribute 'age'
>>> getattr(t, "age","18")  #若属性不存在,返回一个默认值。
'18'
>>>

  

  7. setattr(object, name, values)

  给指标的天性赋值,若属性不设有,先制造再赋值.

>>> class test():
...     name="xiaohua"
...     def run(self):
...             return "HelloWord"
...
>>> t=test()
>>> hasattr(t, "age")   #判断属性是否存在
False
>>> setattr(t, "age", "18")   #为属相赋值,并没有返回值
>>> hasattr(t, "age")    #属性存在了
True
>>>

 

  8. item 星罗棋布: 和对象使用 [ ] 访问值有联系

    __getitem__

class B:
  #def __init__(self,lis):
    #self.lis = lis
  def __getitem__(self,item):
    return  getattr(self,item)
    #return self.lis[litem]
  def __setitem__(self,key,value):
    setattr(self,key,value)
    #self.lis[key] = vslue
  def __delitem__(self,key):
    delattr(self,key)
    #self.lis.pop(key)

b = B()

b['k'] = 'v1'  #触发__setitem__
print(b['k1']) #  __getitem__
del b['k1']   #  __delitem__

#b = B(['11','22','33','44'])
#print(b.lis[0])
#B[3] = '99'
#print(b.list)
#del b[2]
#print(b.lis)

 

  9. hash方法

   底层数据结构基于hash值寻址的优化操作

   hash是四个算法能够把某2个要设有内部存款和储蓄器里的值通过一连串计算,保险区别值hash

   值的结果差别.

   对通二个值数十次实践的python代码的时候hash值的结果是不一致的,不过对通二个值

   再痛3次执行python代码的时候hash值永远不变. 

class Employee:
    def __init__(self,name,age,sex,partment)
        self.name=name
        self.age=age
        self.sex = sex
        self.partment = partment
    def__hash__(self):            #筛选hash值相等
        return hash('%s%s' % (self.name,self.sex))
    def __eq__(self,other):        #筛选值相等
        if self.name == other.name and self.sex == other.sex
            return True
    employ_lst = [...]
    for i in range(200)
            employ_lst.append(Employee('alex',i,'male','python'))
     for i in range(200)
            employ_lst.append(Employee('wusir',i,'male','python'))  
    for i in range(200)
            employ_lst.append(Employee('taibai',i,'male','python'))    
employ_lst = set(employ_lst)
for person in employ set :
    print(person.__dic__ )


#set集合的去重原理

  10. eq 方法

class A :
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __eq__(self,other):
        if self.name == other.name and self.age == other.age:
            return True

a = A('小白',88)
aa = A('大白'99)
aaa = A('超大白',100)

print(a,aa)
print(a == aa == aaa)     # == 这个语法是完全和__eq__相关

 

  11. 析构方法  

    释放叁个空间

    归还/释放部分在创制对象的时候借用的部分能源

class A :    
    def __del__(self):   #析构方法 del A的对象 会自动触发这个方法 
        print('饿了吗')
a = A()
del a    #对象删除 del    当不主动进行该操作时,python解释器在程序执行
                #完后也会自动触发 __del__ 函数(垃圾回收机制).
print(a)        

 

 

    

   

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图