一面向对象相关

谈谈你对面向对象的理解

  1.泛泛谈:什么情况下使用面向对象

  2.针对面向对象的 封装 继承 多态一个一个的谈

  3.根据你工作中的实际情况对应来举例子

封装

1.广义上:普遍的大家认为的封装,就是把一类相同属性和方法的事务抽象为一个类

  把属性和方法封装在一个类中

  是为了复杂的角色关系的程序中,能够把属于各个角色的方法分开

  使得代码更加简洁 清晰(狗不能调用attack,人不能调用bite)

 狭义上:在类中,可以定义一些私有成员(静态属性,方法,对象的属性)

    __私有的成员名,就定义为私有的了

    不能在类的外部使用,也不能被继承,旨在保护类中的一些信息

 应该知道

  为什么私有的成员不能在类的外部直接使用?

    所有的私有成员,都是在创建的时候变异了,变成_类名__私有的成员名

  为什么私有的成员可以直接在类的内部使用?

    在类的内部使用私有成员的时候,类会自动的在这些成员的前面加上_类名

  

  什么情况下使用封装:

    某一个属性(静态属性\对象属性):不想被查看,不想被随意修改(只能看,但是不能(随意)改)

    某一个方法: 不想被外部调用

  不善于使用封装的概念,分不清楚什么情况下使用:

    最好能够符合规范的开发

    即使没有恰当的使用封装,也不影响我们实现代码的功能

二.

子类不能继承父类的私有方法

class Foo(object):
# A = 123
# __私有的静态变量 = 'ABC' # _Foo__私有的静态变量
# print('---> ',__私有的静态变量) # 在类的内部使用 _Foo__私有的静态变量
#
# class Son(Foo):
# def func(self):
# print('--> 1 ',Son.A) # 子类没有找父类,能找到
# print('--> 2 ',Foo.__私有的静态变量) # 子类没有找父类,找不到"_Son__私有的静态变量"
type object 'Foo' has no attribute '_Son__私有的静态变量'
# # print(Foo.__私有的静态变量)
# Son().func()

子类的内部不能使用父类的私有方法

class Foo(object):
def __func(self): # self._Foo__func
print('in foo') class Son(Foo):
def wahaha(self):
self.__func() # self._Son__func,不能在子类的内部使用父类的私有方法 s = Son()
s.wahaha()
class Foo(object):
def __init__(self):
self.__func() # _Foo__func
self.func() def __func(self):print('in Foo __func') # _Foo__func def func(self):print('in Foo func') class Son(Foo):
def __func(self):print('in Son __func') # _Son__func def func(self):print('in Son func')
Foo()._Foo__func()
Son()
# 调用私有的方法或者属性
# 不需要考虑self是谁的对象
# 只要是私有的方法或者属性,就一定是在调用的当前类中执行方法
# 当某个方法或者属性,不希望被子类继承的时候,也可以把这个方法\属性定义成私有成员

三.三个装饰器方法
@classmethod

@property

@staticmethod

class A:
__count = 0 # 隐藏了count属性
def __init__(self,name):
self.name = name
self.__add_count() # 每一次实例化的时候调
# 用私有方法来对__count进行累加
@classmethod
def __add_count(cls): # 定义一个私有的方法
# print(cls,A)
cls.__count += 1 # 让这个方法只能在类的内部被使用 @classmethod # 被classmethod装饰器装饰的方法,都有一个默认的参数,这个参数就是当前类
def show_count(cls): # 定义一个普通方法,
# print(cls,A)
return cls.__count # 让用户可以从外部查看__count的值 print(A.show_count())
alex = A('alex')
print(alex.show_count())
yuan = A('yuan')
print(A.show_count())
为什么有类方法
# 有的时候,
# 在类中会有一种情况,就是这个方法并不需要使用某一个对象的属性
# 因此 这个方法中的self参数是一个完全无用的参数
# show_count是一个查看类中属性的方法,这样的方法和某一个对象并没有直接联系 # 本质上 : 一个方法不用对象属性但是使用静态属性 -- 类方法@classmethod
# 某一个方法被创造出来,就是为了进行对静态变量进行操作
# 根本不涉及到对象
# 所以这个方法就应该被定义成 类方法(被@classmethod装饰)
# 调用这个类方法,可以使用对象调用,也可以使用类调用
# 但是这个方法的默认参数永远是当前类的命名空间,而不是对象的
# 如果一个类中的方法不用对象属性也不用静态属性 -- 静态方法@staticmethod
# 那实际上这个方法就是一个普通的函数
class User(object):
@staticmethod
def login(arg1,arg2): # 是User类中的名字 函数的名字 login就是一个类中的静态方法,本质上就是一个函数
print(arg1,arg2)
return (arg1+arg2)
class Student(User):pass
class Manager(User):pass ret = User.login(1,2)
print(ret)#3
a=Student.login(2,4)
print(a)#6
b=Manager.login(2,3)
print(b)#5
#               普通的方法               类方法                 静态方法
# 默认参数 self cls 无
# 操作的变量 操作对象的属性 操作静态属性 既不操作对象属性,也不操作类的属性
# 所属的命名空间 类 类 类
# 调用方式 对象 类/对象 类/对象
# 对应的装饰器 无 @classmethod @staticmethod
# 用哪一个命名空间中的名字,就定义不同的方法
# 只要用self 就是普通方法,只能用对象调
# 只要用cls 就是类方法,可以用类,可以用对象
# 啥也不用 就是静态方法,可以用类,可以用对象 # 私有的
# 私有的普通方法
# 私有的类方法
# 私有的静态方法 # 先定义类
# 写方法
# 写具体的方法中的代码
# 写完之后,发现没有用到self,那么如果用到类,就定义成类方法,如果啥也没用到,静态方法 # 先定义函数
# 写函数
# 写具体函数中的代码
# 写完之后,发现要挪进类里,如果啥也没用到,静态方法;如果用到类,就定义成类方法

day30 Pyhton 面向对象 继承.装饰器的更多相关文章

  1. python基础-面向对象(装饰器)

    属性:   @property   @method_name.setter   @method_name.deleter   三个标签都是放在方法的上面来使用,且方法名要和后续使用的   变量名字相一 ...

  2. python中面向对象之装饰器

    python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...

  3. Python面向对象-@property装饰器

    python中,我们可以直接添加和修改属性的值: >>> class Student(object): ... pass ... >>> s = Student() ...

  4. Python 基础之面向对象之装饰器@property

    一.定义 装饰器@property可以把方法变成属性使用作用: 控制类内成员的获取 设置 删除获取 @property设置 @自定义名.setter删除 @自定义名.deleter 二.具体实现 1. ...

  5. day30 Pyhton 面向对象 反射

    @property # 例1 - 1 (某一个属性如果是通过计算得来的,那么计算的过程写在方法里,把这个方法伪装成属性) from math import pi # class Circle: # d ...

  6. day28 Pyhton 面向对象 继承

    1.昨日回顾 类的命名空间 静态属性\动态属性(方法) 对象的命名空间 #对象的属性 #类指针:对象能够通过这个类指针找到类 #静态属性:属于类,多个对象共享这个资源 #尽量用类名来操作静态属性 #对 ...

  7. day29 Pyhton 面向对象 继承进阶

    一.内容回顾 初识继承 父类\基类\超类 子类\派生类 派生 :派生方法.派生属性 单继承 继承的语法class子类名(父类名) 解决开发中代码冗余的问题 子类继承了父类之后,可以调用父类中的方法 如 ...

  8. Python-老男孩-02_装饰器_面向对象_封装_继承_异常_接口_数据库

    装饰器其实也是一个函数,它的参数是一个函数 ; 其它函数与装饰器之间建立联系是通过 @装饰器函数名, 感觉有点像Spring的面向切面编程 装饰器函数,如何处理原函数的参数.?  装饰器 原函数返回值 ...

  9. 初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)

    封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# ...

随机推荐

  1. InnoDB 引擎中的索引类型

    首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理. MySQL ...

  2. ES ElasticSearch 7.x 下动态扩大索引的shard数量

    ES ElasticSearch 7.x 下动态扩大索引的shard数量 背景 在老版本的ES(例如2.3版本)中, index的shard数量定好后,就不能再修改,除非重建数据才能实现. 从ES6. ...

  3. web测试——弱网测试、暂停页面执行

    1.弱网测试: 2.暂停页面执行 1.js代码:可以直接在页面上打断点 缺点:需要看懂前端的代码 2.点击暂停按钮,如下图,再次点击,可继续运行

  4. css的引用关系

    总结:离div标签越近,越先被引用 先在同级目录下新建一个stylesheet(是以.css结尾的)注意:link引入进来的css中,class标签也是c1,因为html中div class=c1,因 ...

  5. [程序员代码面试指南]二叉树问题-判断t1树是否包含t2树的全部拓扑结构、[LeetCode]572. 另一个树的子树

    题目1 解 先序遍历树1,判断树1以每个节点为根的子树是否包含树2的拓扑结构. 时间复杂度:O(M*N) 注意区分判断总体包含关系.和判断子树是否包含树2的函数. 代码 public class Ma ...

  6. vue父子组件状态同步的最佳方式续章(v-model篇)

    大家好!我是木瓜太香!一名前端工程师,之前写过一篇<vue父子组件状态同步的最佳方式>,这篇文章描述了大多数情况下的父子组件同步的最佳方式,也是被开源中国官方推荐了,在这里表示感谢! 这次 ...

  7. turtle角度坐标体系

    seth()改变海龟的行进角度 例如 让海龟的方向朝着45°方向行进 turtle.seth(45) 让海龟的方向朝着-135°反方向行进 turtle.seth(-135) turtle.left( ...

  8. Linux环境变量总结 转

    转自https://www.jianshu.com/p/ac2bc0ad3d74 Linux是一个多用户多任务的操作系统,可以在Linux中为不同的用户设置不同的运行环境,具体做法是设置不同用户的环境 ...

  9. 【Jenkins】三、设置定时任务

    1.点击工程(Test1), 选择左侧的配置 2.选择"构建触发器"下面的"定时构建" 3.填写定时规则(这里设置每隔30分钟执行一次) 4.定时规则语法字段 ...

  10. 基于SpringBoot+SpringDataJpa后台管理

    昨天朋友找我喝酒,说30岁了,比较焦虑,钱没赚到,整天被媳妇数落. 其实现在我们看到的不一定就事真实的情况,就算从高斯分布看,平平淡淡的人生才是大部分人的轨迹.当然抖音.知乎上的不能比,人均收入百万, ...