首页 > 其他 > 详细

面向对象

时间:2020-05-23 22:07:14      阅读:51      评论:0      收藏:0      [点我收藏+]

面向对象编程:

Object Oriented Programming,简称 OOP,是一种程 序设计思想。

OOP 把对象作为程序的基本单元(一切皆为对象)

面向对象的程序设计把计算机程序视为多个对象的集合

  • 对象:通过类定义的数据结构实例,类的实例化。对象包括两个数据成员(类变量和实例变量)方法
  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法:类中定义的函数。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。

Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

对象可以包含任意数量和类型的数据。

类的定义:

class 类名(父类):
    属性
    方法

class stu(object):
    name = “zhangsan”
    def sleep(self):
        print(“I am sleeping”)

#name:  属性
#sleep函数:方法

类的使用:

obj = stu()     #实例化一个stu类的对象obj
print(obj.name)   #访问类中的属性
obj.sleep()    #调用类中的方法

__init__() 方法(构造方法):

类在实例化一个对象的时候会自动调用__init__方法。

obj = stu()  #此时对应的 __init__() 方法就会被调用

当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。

class stu(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

obj = stu(zhangsan, 18)
print(obj.name, obj.age)

self:

self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

class stu:
    def add(self):
        print(self)
        print(self.__class__)
obj = stu()
obj.add()

运行结果:
<__main__.stu object at 0x000001940D4715C0>
<class __main__.stu>

通过__init__方法的默认参数实现:实例化对象的时候既可以传参也可以不传参。

class stu(object):
    def __init__(self, name="zhangsan", age=18):
        self.name = name
        self.age = age

s = stu()
print(s.name,s.age)

运行结果:
zhangsan 18

属性的定义:

class stu(object):
    def __init__(self, name, age):
        self.name = name   #定义属性name
        self.age = age    #定义属性age

属性和方法的访问:

在类的外部访问:object.属性    object.方法  (object为对象名)。

class stu(object):
    name = “zhangsan”
    def sleep(self):
        print(“I am sleeping”)

s  = stu()
print(s.name) 
s.sleep()

在类的内部访问:self.属性 self.方法(实参列表)

class Test(object):
    def __init__(self, name):
        self.name = name
    def func1(self):
        print(self.name)
    def func2(self):
        self.func1()

类中的属性默认是可以在类的外部通过类的实例化对象访问的。

如果希望内部属性不被外部访问(对象通过句点符号引用),可以在属性名称前加上 双下划线 __, 该属性则为私有属性,只能在类内部访问。

class Test(object):
    def __init__(self, name):
        self.__name = name
    def func1(self):
        print(self.__name)

通过类的实例化对象访问和修改私有属性。

class Test(object):
    def __init__(self, name=None):
        self.__name = name
    def get_name(self):
        return self.__name
    def set_name(self, name):
        self.__name = name
s = Test()
s.set_name(zhangsan)
name = s.get_name()
print(name)

面向对象三大特征:

1.封装

到底封装的是什么?

-属性(数据)

-方法

2.继承

面向对象编程的优点之一:代码重用。实现代码重用的方法 -> 继承

类的非私有方法非私有属性可以继承给他的子类

继承的类:子类、派生类

被继承的类:父类、基类

继承基类的方法:

class Animal(object):
    def run(self):
        print(Animal run)
class Dog(Animal):
    pass

d = Dog()
d.run()

继承基类属性:

#继承非私有属性
class Animal(object):
    def __init__(self, name):
        self.name = name
class Dog(Animal):
    pass

d = Dog("wangcai")
print(d.name)

多重继承:

假设我们要实现以下4种动物: Dog - 狗狗 Bat - 蝙蝠 Parrot - 鹦鹉 Ostrich - 鸵鸟。

如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次:

技术分享图片

class Animal(object):
    pass
# 大类:
class Mammal(Animal):
    pass
class Bird(Animal):
    pass
# 各种动物:
class Dog(Mammal):
    pass
class Manmal(object):
    def run(self):
        print(Running...)

class Flyable(object):
    def fly(self):
        print(Flying...)

class Bat(Manmal, Flyable):
    pass

3.多态

一个类的方法有多种形态。

子类继承父类的方法时,如果需要对父类的方法进行修改,则需要在子类中对该方法进行“重写”。

class Animal(object):
    def __init__(self, name):
        self.__name = name
    def run(self):
        print(animal run)
class Dog(Animal):
    #重写
    def run(self):
        print(dog run)
        super().run()

d = Dog("dog")
d.run()

获取对象信息:

type()

isinstance()

dir()

获得一个对象的所有属性和方法,可以使用 dir()函数,它返回 一个包含字符串的 list。

__new__()方法

对象的构造和内存的分配

一个类只能构造一个对象,在实际工作过程中某些事物就是唯一的!!

考察的核心:一个对象的构造的过程:__new__() -> __init__()

class Earth(object):
    Instance = None
    #注意:__new__的参数是cls 而是不是self
    #cls:这个类本身
    #首先我们需要明白一件事情:构造一个对象其实就是需要在内存中开辟一块空间
    #如果我们使用某个类来构造一个对象,对象的内存空间的分配是由类实现的
    #重写object类中的__new__
    def __new__(cls, *args, **kwargs):
        #如果这个类构造过对象,不需要重新分配空间了
        if cls.Instance == None:
            #如果这个类没有构造过对象,则需要分配空间
            cls.Instance = super().__new__(cls,*args, **kwargs)
            #print(type(Instance))
            return cls.Instance
        else:
            return cls.Instance

earth = Earth()
print(earth)
earth = Earth()
print(earth)

super() 函数是用于调用父类(超类)的一个方法。

class A:
     def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super().add(x)
b = B()
b.add(2)  # 3

单列模式:

class Earth(object):
    _instance = None
    def __init__(self):
        print("Hi, I Am The Earth")
    def __new__(cls):
        # 如果这个类在此之前没有构造过对象,则构造一个对象
        if cls._instance == None:
            print("new earth")
            cls._instance = super().__new__(cls)
            # print(type(cls._instance))
            return cls._instance
        # 如果这个类再此之前已经构造过对象,则不构造对象返回原来的对象
        else :
            return cls._instance

e1 = Earth()
e2 = Earth()
print(id(e1), id(e2))

鸭子类型:

class Dog(object):
    def swimming(self):
        print(dog swimming)

def func(obj):
    obj.swimming()

duck = Duck()
dog = Dog()

func(duck)
func(dog)

 

面向对象

原文:https://www.cnblogs.com/-Leif/p/12944241.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!