面向对象编程——类(class)1

一、函数式编程 与 面向对象编程

def 函数名(参数):
    pass

class 类名:
    def 函数名(self,参数):       # self必填
        pass

z1 = 类名()    # 这时,调用对象 z1,self参数即为 z1

例1:

class bar:
    def foo(self,arg):
        print(self,arg)

z1 = bar()
print(z1)               # <__main__.bar object at 0x0000019BC3088D30>
z1.foo(‘wjz‘)           # <__main__.bar object at 0x0000019BC3088D30> wjz

z2 = bar()
print(z2)               # <__main__.bar object at 0x0000019BC306B358>
z2.foo(‘wjk‘)           # <__main__.bar object at 0x0000019BC306B358> wjk

从上面的例子可以看出,self 就是当前调用的对象(即使后面继承时);

例2:

class bar:
    def foo(self,arg):
        print(self.job,arg)

z1 = bar()
z1.job = ‘IT‘
z1.foo(‘wjz‘)           # IT wjz

z2 = bar()
z2.job = ‘IT‘
z2.foo(‘wjk‘)           # IT wjk

从上面可以看出,当向对象存储变量时,它会把该变量传给类里面的方法;

二、面向对象三大特性:封装、继承、多态

1. 封装

构造方法:

当 obj = 类名()  时,实际上是做了两件事:
    在内存中开辟空间,创建对象;
    通过对象,自动执行了一个方法:__init__方法(别名:构造方法)。

把公用的变量封装到init方法中。 例如:

class DataBaseHelper:
    def __init__(self,ip,port,username,password):
        self.ip = ip
        self.port = port
        self.username = username
        self.password = password

    def insert(self):
        pass

    def delete(self):
        pass

    def update(self):
        pass

    def select(self):
        pass

适用场景:如果多个函数都用一些共同参数,则适合面向对象来做。例如上面数据库操作;

2. 继承

举例:

class f:
    def f1(self):
        print("in the f.f1")

class s(f):                     #这里加一个括号,指明该类的父类(基类);子类(派生类)会继承父类的方法;s类中找不到发方法,会去f类中找。
    def s1(self):
        print("in the s.s1")

    def f1(self):
        super(s,self).f1()      # 这里super(s,self) 表示是s的父类;
        f.f1(self)              # 这个等效上面这句 super(s,self).f1();注意,一定不能忘记self
        print("in the s.f1")

z = s()
z.f1()

多继承: 如果子类继承多个父类,则排在前面的父类优先;如:

class father1:
    def a1(self):
        print("in the f1.a1")

class father2:
    def a1(self):
        print("in the f2.a1")

class son(father1,father2):         # father1在前面,优先继承;
    def s1(self):
        print("in the son.s1")

z = son()
z.a1()                  # 等效 son.a1(z)  打印 in the f1.ar   此时,father1和father2都有a1方法,并且son的父类有两个,则按顺序优先。

上面例子中,假如father1中没有a1方法,而father2有。但是father1的父类有a1,则继续在father1的父类中查找。都没有时,才会去father2。但是,如果father0是father1和father2共同的父类,则会最后继承共同的父类。如图:

3. 多态

python中,原生多态。这个不重要,先忽略吧。

三、 类

类成员

类(class)的成员有字段、方法;其实还有一个属性

  • 字段分为静态字段、普通字段;
  • 方法分为构造方法、静态方法、普通方法、类方法;

1. 字段

在类中定义的变量,称为静态字段,属于类,保存在类中,可以通过类或者对象访问;

在类中的方法中定义的字段,称为普通字段,属于对象,保存在对象中,只能通过对象访问;

如下:

  • class make:
        port = 22                       # 静态字段
        def __init__(self,ip,username,passwd):
            self.ip = ip                # 普通字段
            self.username = username
            self.passwd = passwd
    
    z1 = make(‘1.1.1.1‘,‘root‘,‘123456‘)
    print(z1.ip,z1.username,z1.passwd,z1.port)      # 打印 1.1.1.1 root 123456 22
    
    z2 = make(‘2.2.2.2‘,‘admin‘,‘admin‘)
    print(z2.ip,z2.username,z2.passwd,z2.port)      # 打印 2.2.2.2 admin admin 22
    
    print(make.port)                                # 打印 22      可见,静态字段属于类,同时也可以通过类对应的对象取得(因为对象通过类对象指针指向该类)。
    

2. 方法

构造方法:在上面面向对象三大特性之封装章节已经提到,即init方法;self是必须的;

普通方法:和构造方法一样,只是名字不是 init的方法就是普通方法;由对象调用,也可以通过类进行调用(必须指定self对象),self是必须的;

静态方法:在普通方法前面加上装饰器 staticmethod,即是静态方法;但是有个区别:self不是必须的;普通方法调用时,self就是当前调用对象;而静态方法中,如果指定了self,则必须指定self才可以;由类或对象(对象调用其实是根据类对象指针,通过类进行调用)调用;

类方法:在普通方法前面加上装饰器 classmethod,即是类方法;类方法中,一般不使用self,而是写成 cls,cls为当前类;由类直接调用;类方法和静态方法没有太大区别;

例如:

  • class make:
    
        def __init__(self):         # 构造方法
            pass
    
        def upload(self):           # 普通方法
            pass
    
        @staticmethod
        def status(self):           # 静态方法,self不是必须的,可以不要self;
            pass
    
        @classmethod
        def classmd(cls):           # 类方法,这里一般写cls
            print(cls)
            pass
    
    make.classmd()              # 打印结果和 print(make)一样。
    

3.属性

说类的成员有两种。其实还有一种,定义像方法,调用像字段;我们叫它 属性

这种属性还可以修改、删除;其实并不是真的删除,只是伪造字段的操作(修改、删除)

  • class make:
    
        @property
        def its(self):              # 定义属性,如果定义了property之后,后面还有getter,则优先执行getter;如果没有定义getter,则调用时执行property
            print("property")
            return 1
    
        @its.getter
        def its(self):              # 优先级高于property;
            print("getter")
    
        @its.setter
        def its(self,value):              # 定义属性its可以修改
            print(value,"setter")
    
        @its.deleter
        def its(self):              # 定义属性its可以删除
            print("delete")
    
    obj = make()
    r = obj.its                 # obj.its像是调用字段,但是its定义时像方法;
    print(r)                # 返回 1
    
    obj.its = 123456            # 看似是更改,其实是找到 its.setter,然后执行。123456当做参数传给 its.setter
    
    del obj.its                 # 看似是删除,其实是找到its.deleter,然后执行
    

在上面的基础上补充:

class make:
    @property
    def f1(self):
        print("in the f1")
        return 123

    @f1.getter
    def f1get(self):
        print("in the f1getter")
        return 00

    @f1.setter
    def f1set(self,value):
        print("in the f1setter",value)
        return 11

    @f1.deleter
    def f1del(self):
        print("in the f1deleter")
        return 22

    @f1get.fget                     # 这里可以执行 @property修饰的方法f1;
    def f2(self):
        print("in the f2")
        return 456

    @f1set.fset
    def f3(self):
        print("in the f3")
        return 789

    @f1del.fdel
    def f4(self):
        print("in the f4")
        return 000

我们不调用类,只是定义这个类,这时:

        @f1get.fget 会自动执行 f1get方法;

        @f1set.fset 会自动执行 f1set方法;

        @f1del.fdel 会自动执行 f1del方法;

三个是相同的原理,注意:fget可以执行 property、getter的对象;fset只可以执行setter的对象;fdel只可以执行deleter的对象。

这里就拿fget举例:

另外:

def f1(self):
    return 123
per = property(fget=f1)

------ 上下两部分等效 ------

@property
def per(self):
    return 123

同理,

class make:
def f1(self):
    print("in f1")
    return 123

def f2(self,val):
    print("in f2",val)
    return 456
per = property(fget=f1,fset=f2)         # 这里就是关键字参数,fget/fset可以省略,就是位置参数;即,fget、fset、fdel顺序。property(fget,fset,fdel,doc="描述")

z = make()
z.f1 = 123

------ 上下两部分等效 ------

class make:
    @property
    def f1(self):
        print("in f1")
        return 123

    @f1.setter
    def f1(self,val):
        print("in f2",val)
        return 456

z = make()
z.f1 = 123

原文地址:https://www.cnblogs.com/hacker001/p/10094783.html

时间: 2024-10-07 19:58:37

面向对象编程——类(class)1的相关文章

Python 面向对象编程——类和实例

1        面向对象编程 面向对象编程: 面向对象编程--Object OrientedProgramming OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消

Day16:面向对象编程——类和对象

一.面向对象的程序设计 在此之前用到的事面向过程的程序设计,它的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是对象.程

Day28:面向对象编程——类和对象

一.面向对象的程序设计 在此之前用到的事面向过程的程序设计,它的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是对象.程

lua 面向对象编程类机制实现

lua no class It is a prototype based language. 在此语言中没有class关键字来创建类. 现代ES6, 已经添加class类. prototype based 语言没啥优势. lua 如何构建class机制? https://github.com/fanqingsong/oopclass.lua 提供lua的 Object Oriented Programing Class 实现: 比其他实现更加轻量 https://github.com/Yonab

OC面向对象编程-类的声明和对象的创建

一 OC类的声明和实现 1.接口的声明 @interface NewClassName: ParentClassName { 实例变量 ... } 方法的声明 ... @end 2.类的实现 @implementation NewClassName { 方法的实现 //code ... } @end

【Python】[面向对象编程] 类和实例

1.注:必须牢记类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”2.定义类通过class 关键字:class 后面跟着类名,类名通常都是大写开头,接着是(object),表示类是从哪里继承俩的,所有类都继承 自object. class Student(object): pass 3.通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去: class Student(object): def __init__(self, name, scor

面向对象编程(类的绑定方法与非绑定方法)

链接 https://www.cnblogs.com/vipchenwei/p/7126772.html 1.对象绑定方法 1.凡是类中的方法和函数,都是绑定给对象使用的: 2.绑定方法都有自动传值的功能.传递进去的值,就是对象本身. 3.如果类想调用绑定方法,就必须遵循函数的参数规则,有几个参数,就必须传递几个参数. 2.类的绑定方法 类中方法默认都是绑定给对象使用,当对象调用绑定方法时,会自动将对象作为第一个参数传递进去:而类来调用,则必须遵循函数参数一一对应的规则,有几个参数,就必须传递几

python学习day11 面向对象编程 类和实例

class Student(object): #class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的.通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类. def __init__(self,name,score): #通过定义一个特殊的__init__方法,在创建实例的时候,就把类的name,score等属性绑上去,__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__

面向对象编程——类(class)2

一.类成员修饰符 公共成员:可以在类的外部访问到.我们之前接触到的都是公共成员 私有成员:只能在该类的内部才能直接访问到的(子类也不能直接访问):在外部,可以通过间接方法才能取得. 以字段(普通字段和静态字段相同)为例,开头加__(双下划线)使字段变为私有字段:方法也一样,方法名前面加__(双下划线)即可. class db: def __init__(self,ip,username,passwd): self.__ip = ip self.__username = username self