复习打卡--0816多态和属性访问

面向对象三大特征:

封装:将数据和方法放在一个类中,构成封装

继承:子类继承父类属性和方法,可多继承

多态:一个事物有多种形态,一个抽象类有多个子类,不同的子类对象调用相同的方法,产生不同的执行结果。多态可以增加代码的灵活度。是基于类的继承。

class Animal:
    def run(self):
        raise AttributeError(‘子类必须实现这个方法‘)

class Pig(Animal):
    def run(self):
        print(‘pig is walking‘)

class Dog(Animal):
    def run(self):
        print(‘dog is running‘)

def func(obj):  # python的函数参数 无任何类型限制,可以是类本身,也可以是类的对象
    obj.run()

pig1=Pig()
d1=Dog()

func(pig1)
func(d1)

多态的意义:开放封闭原则

  对于一个变量,我们只需要知道它的Base类型,无需知道它的子类型,就可以放心的调用相同的方法quack();

  当需要新增功能时,只需新增一个Base的子类实现quack()方法,就可以在原基础上扩展功能,即开放封闭原则:

      对扩展开放:允许新增一个Base的子类;

      对修改封闭:不要修改Base依赖类型的quack()函数;

鸭子类型

鸭子类型关注点在对象的行为,而不是类型。不要求严格的继承体系。只要行为相似(内部实现相同的方法),即可视为鸭子类型。

class Duck:
    def __init__(self, name):
        self.name = name

    def quack(self):
        print("gua gua")

class Man:
    def __init__(self, name):
        self.name = name

    def quack(self):
        print("女王大人")

def do_quack(ducker):
    ducker.quack()

if __name__ == ‘__main__‘:
    d = Duck(‘duck‘)
    m = Man(‘man‘)
    do_quack(d)
    do_quack(m)

数据类型和自省:

1. 私有属性:类里面定义的属性分为两种:公有属性和私有属性

2. 私有属性定义:

  以单下划线开头_attr :类外部可以直接调用

  以双下划线开头的属性__attr:类外部不能直接调用,被改名了,需要用 _类名__attr 访问;

class People:

    # 初始化参数
    def __init__(self, name):
        self.name = name
        self.__age = 18  # 在需要设置的属性或方法前加双下划线,即设置私有属性或私有方法

    def display(self):
        print(‘%s的年龄是%d‘ % (self.name, self.__age))

XiaoAi = People(‘小爱同学‘)

# 此时age属性为私有属性,不能进行外部访问,否则会报错
# print(XiaoAi.__age)

# 以单下划线+类名的显示,可以访问私有属性
print(XiaoAi._People__age)

XiaoAi.display()

3. python不能实现真正的私有属性,但通过下划线开头,可以得到伪私有属性。大部分python代码遵循规则:以下划线开头的属性为私有属性,被视为非公开的API的一部分,仅用于实现细节。

4. __dict__: 类.__dict__:返回该类 属性、方法的字典;实例.__dict__:返回实例的 属性、方法字典;实例.方法.__dict__:返回方法的 属性、方法字典

__doc__: 类.__doc__:返回该类的注释说明;实例.方法.__doc__:返回方法的注释说明 ;模块.__doc__:返回py文件模块的注释说明文档

__slots__:类的属性范围锁定,仅允许绑定__slots__= [ ]列表中已有的属性,可节约内存,提高性能。

自定义属性访问

内置函数:

getattr: 获取属性 ,触发魔术方法 object.__getattr__()

setattr: 设置属性,触发魔术方法 object.__setattr__()

delattr: 删除属性,触发魔术方法 object.__delattr__()

1. object.__getattr__:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发。

2.object.__getattrible__: 访问属性的时候,第一时间触发该方法去找属性。如果没找到触发AttrError。当我们去访问一个不存在的属性时,首先会触发__getattribute__,然后才会触发__getattr__ 
如果属性存在,就返回这个属性值,如果没有就报 AttrError

3.object.__setattr__:设置属性

4.object.__delattr__:删除属性

原文地址:https://www.cnblogs.com/qingyuu/p/12255571.html

时间: 2024-10-15 09:52:14

复习打卡--0816多态和属性访问的相关文章

ie8 报错:意外地调用了方法或属性访问

在某场景中一句简单的js: $("#changeOption").text("增加"); 在 IE8 下面报错:'意外地调用了方法或属性访问' 改成:$("#changeOption").html("增加"); 报同样的错. 改成:document.getElementById('changeOption').innerText="增加"; 同样报错:"未知的运行时错误" 最后改成:$(

Python类属性访问的魔法方法

Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- 定义当该类的属性被访问时的行为 注意:当__getattr__与__getattribute__同时重写时,访问属性时,优先调用__getattribute__,只有当被访问的属性不存在时才触发__getattr__ 3. __setattr__(self, name, value)- 定义当一个

14.C#属性访问器、命名空间、pragma指令(七章7.3-7.5)

看到一些零星的知识片,今天就用自己的理解说明下,也是因为太简单了,一下就过的,也是我们日常开发中常用.留下一个脚印,当书不在手上的,也能翻出来看看.说下属性访问器.命名空间和pragma指令. 属性访问器在01.C#数据类型.排序.过滤(一章1.1-1.2)有所提到,在C#3后可以使用修饰符去修饰属性的取值和赋值,也可以使用加入一些验证,如下: 1 class Plant 2 { 3 private double Height = 0.0; 4 5 //是否需要修剪 6 public bool

javascript的属性访问

可以通过点运算符(.)来访问引用的属性.只要在点运算符之后书写属性名,就能够读取相应的属性值. //js>print(obj.x) 3 如果属性的值是一个对象,可以像下面这样通过多次点运算符来读取其属性. js>var obj2={pos:{x:3,y:4}}; js>print(obj.pos.x); 3 如果赋值给尚不存在的属性名,则将新建该属性并对其赋值. js>obj.z=5; js>print(obj.z); 5 属性访问(括号方式) js>print(obj

SEAndroid安全机制对Android属性访问的保护分析

Android系统通过属性暴露设备和运行时信息,并且可以通过设置属性来控制系统行为.因此,属性也像文件一样,是一种需要保护的资源.在启用SEAndroid之前,敏感属性只能被预先设定的进程进行设置.启用SEAndroid之后,敏感属性会进一步被SEAndroid安全策略保护.这样就可以更有效地保护系统属性了.在本文中,我们就详细分析SEAndroid安全机制对Android属性设置保护提供的支持. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在分析SE

魔法方法:属性访问

__getattr__(self,name) 当用户试图访问name,而name属性不存在时就会调用getattr __getattribute__(self,name) 当用户试图访问name时就会调用getattribute __setattr__(self,name,value)当name被设置为value的时候就会调用setattr __delattr__(self,name)当name属性被删除时就会调用delattr 只有重写以上四个魔法方法,就可以改变属性访问

Python学习之属性访问与描述符详解

在Python开发中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象 foo ,它有一个 name 属性,那便可以使用 foo.name 对此属性进行访问.一般而言,点(.)属性运算符比较直观,也是我们经常碰到的一种属性访问方式.然而,在点(.)属性运算符的背后却是别有洞天,值得我们对对象的属性访问进行探讨. 在进行对象属性访问的分析之前,我们需要先了解一下对象怎么表示其属性.为了便于说明,本文以新式类为例.有关新式类和旧式类的区别,大家可以查看Pyt

045魔法方法:属性访问

属性访问:__getattr__(self,name)  定义当用户试图获取一个不存在的属性时的行为 __getattribute__(self,name)  定义当该类的属性被访问时的行为 __setattr__(self,name,value)  定义当用一个属性被设置时的行为 __delattr__(self,name)  定义当用一个属性被删除时的行为 例:>>> class C:  ...     def __getattribute__(self, name):       

采用表达式树提升属性访问性能

项目背景, 采用贫血模式, 但希望在使用业务实体机业务规则上的数据属性,使用同一规则. 比如:在页面中, “RS_Department.Code" , "Department.Code"都可以正常访问. 业务实体类 直接使用Linq to Sql 自动生成的代码,跟数据库表一一对应. 如:RS_Requisition, RS_Department 业务规则类 实现数据库增删改查,扩展属性,其他业务规则等. public class Requisition : BLLTable