2020-11-29

面向对象三大特性

一.封装

-->概念:封装是指隐藏对象中的一些不希望被外界访问到的属性和方法

-->作用:增强存储数据的安全性

1.封装的引入

class Cat():

    def __init__(self,name,color):

            self.name = name

            self.color = color

    def speak(self):

            print("miao")

    def sleep(self):

            print("%s is sleeping"%self.name)

c1 = Cat("小白","white")

print(c1.name)         小白

print(c1.color)         white

这些属性是可以在类对象外部进行修改的,所以这是不安全的,需要一种方式去增强数据的安全性,即属性不能随意修改,且不能修改为任意的值,因此需要进行封装

2.封装的方法

    <1>将属性名修改为希望外界不知道的名字self.hidden_name = name(此法防君子不防小人)

    <2>提供一个getter和setter方法是外部可以访问并修改属性

            优点:增加验证,提高数据存储的安全性

class Cat():

        def __init__(self,name,color):

                self.hidden_name = name        #方法1的体现,防君子不防小人

                self.color = color

        def get_name(self):         # get_name获取name

                return self.hidden_name

        def set_name(self,name):        #set_name修改name

                self.hidden_name = name

c1 = Cat("小白","white")

# print(c1.get_name())    #小白

c1.set_name("大黑")

print(c1.hidden_name)    #大黑

    <3>可以对对象的属性使用双下划线的方式__xxx   这个其实是:_类名__属性名(python内置)

class Dog:

        def __init__(self,name):

                self.__name = name

        def get_name(self):

                return self.__name

        def set_name(self,name):

                self.__name = name

d1 = Dog("小黑")

print(d1.get_name())         # 小黑   未修改前的访问

d1.__name = "小白"        #强行修改

print(d1.get_name())     # 小黑    #不能随意修改了

// 硬要修改,使用内置方法,_类名__属性名(python内置)

print(d1._Dog__name)    #小黑

d1._Dog__name ="小白"

print(d1._Dog__name)    #小白

二.继承

-->继承简介

    1.提高代码复用性    2.让类与类之间产生了关系,才引出了多态

具体操作:在一个类的创建出来的括号中添加一个父类(超类,基类),继承父类的方法

  [注意]  :   如果省略的父类,那么默认父类为Object,Object是所有类的父类    [注意]如果子类和父类有相同的方法时,那么调用该方法时,会调用子类的方法.

    这种特性称之为方法的重写.(可理解为就近原则)

class Animal:        //定义第一个类(父类)

        def run(self):

                print("animal running")

        def speak(self):

                print("animal speaking")

class Dog(Animal):        //定义第二个类(子类),并声明父类位Animal 

        def run(self):

                print("dog running")

        def look_home(self):

                print("dog can look home")

d1 = Dog()

# 继承Animalrun和speak方法

d1.run()        #animal running

d1.speak()    #animal speaking

# 方法的重写:Animal 和 Dog 都有run方法

d1.run()    #dog running 就近原则,自己有先使用自己的

-->多重继承

python种支持多重继承,即一个类对应多个父类

如果多个父类中有相同方法,那么前面的方法会把后面的覆盖

父类查看方法:__bases__查看当前类的父类(base后面有s,所以这个可以检验一个或多个父类)  格式:类名.__bases__

class Ag():         //定义第一个类

        def test(self):

                print("hello")

class Bg():         //定义第二个类

        def test(self):

                print("world")

class C(Ag,Bg):          //定义第三个类(并声明该类的父类位Ag和Bg)

        pass

print(C.__bases__)  #(<class '__main__.Ag'>, <class '__main__.Bg'>)

c = C()

c.test()    #hello  前面的父类会把后面的用拥有的相同方法覆盖

三.多态

#多态的意思是,不同的对象,都实现了同一个接口,

#因此我们可以不管这个对象是什么,直接调用这个方法就可以了。

class A:

        def __init__(self,name):

                self._name = name

        @property

        def name(self):

                return self._name

        @name.setter

        def name(self,name):

                self._name = name

class B:

        def __init__(self,name):

                self._name = name

        @property

        def name(self):

                return self._name

        @name.setter

        def name(self,name):

                self._name = name

class C():

        pass

a = A('小黑')

b = B('小红')

c = C()

def speak(obj):

        print("你好,我是%s"%obj.name)

speak(a)         # 你好,我是小黑

speak(b)         # 你好,我是小红

speak(c)         # AttributeError: 'C' object has no attribute 'name'

多态简单实例(加深理解)

len()

多个对象都能够使用len()函数,因此在len()体现了面向对象的多态特性

因此正是由于多态的这种特性,大大提高了代码的复用率,提高效率

lst = [1,2,3,4]

s ="python"

print(len(lst))        #4

print(len(s))        #6

四.属性和方法

类属性:

            在类中定义的属性 可以被类对象和类创建出来的实例对象访问,

            只能通过类对象去修改,无法通过实例对象修改

实例属性:

            通过实例定义的属性,只能被实例对象访问和修改,不可被类修改和访问

类方法: 

            第一个参数位cls,系统自动传入,cls指当前的类对象,可以被类对象和类创建出来的实例对象访问,

实例方法: 

            在类中直接定义,以self位第一个参数开头的都是实例方法,

            可以通过实力调用a.方法名()

            也可以通过类调用A.方法名(a)

静态方法:

            无关于类的方法,一个无关竟要的方法,比如获得当前时间,工具方法

class A():

        num =1

a = A()

//类属性

# print(A.num)    #1

# print(a.num)    #1


class B():

num =1

    def __init__(self):          # 实例属性

            self.name ="小黑"


    def test(self):         # 实例方法

            print("test方法被调用了")


    @classmethod

    def test_class(cls):        //类方法

            print("test_class方法被执行了")

    @staticmethod        //静态方法

     def test_calm():

            print("我是静态方法")

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容