1.私有成员公有成员

1.1 类的私有属性

# class A:
#
#     name = '周道镕'
#     __name = 'zdr'  # 私有类的属性
#
#     def func(self):
#         print(self.name)
#         print(self.__name)
# obj = A()
# obj.func()
结论:在类的内部可以访问
# class A:
#     name = '周道镕'
#     __name = 'zdr'  # 私有类的属性
#
#     def func(self):
#         pass

# obj = A()
# print(obj.name)
# print(A.__name)   #报错
# print(obj.__name) #报错
结论:类的外部不能访问
# class A:
#     name = '周道镕'
#     __name = 'zdr'  # 私有类的属性
#
# class B(A):
#     def func(self):
#         print(self.__name)
#
# obj = B()
# # print(obj.__name)
# obj.func()    # 报错
结论:类的派生类不能访问

1.2 类的私有方法

# class A:
#
#     def func(self):
#         self.__func()
#         print('in A func')
#
#     def __func(self):
#         print('in A __func')
#
# obj = A()
# obj.func()
# obj.__func()      # 报错
结论:类的私有方法不能在类的外部使用

1.3 对象的私有方法

class A:
    def __init__(self,username,pwd):
        self.username = username
        self.__pwd = pwd

    def md5(self):
        self.__pwd = self.__pwd + '123'

obj = A("7255322","123456789")
print(obj.__pwd)    # 报错
结论: 只能在类的内部使用,不能在类的外部使用以及派生类使用

私有成员来说: 当你遇到重要的数据,功能,(只允许本类使用的一些方法,数据)设置成私有成员.

python的所有私有成员都是纸老虎,形同虚设
class A:

    name = '周道镕'
    __name = 'zdr'  # 私有类的属性#
    def __func(self):
        print('in __func')

print(A.__dict__)
print(A._A__name)
A._A__func(123)
obj = A()
obj._A__func()

类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上 _类名 .

2.实例方法

实例方法就是类的实例能够使用的方法

class A:

    def func(self):
        print('实例方法')

3.类方法

加classmethod装饰器的方法就是类方法

class A:

    def func(self):
        print('实例方法')

    @classmethod
    def cls_func(cls):
        # print(f'cls---->{cls}')
        obj = cls()
        print(obj)
        print('类方法')

# A.cls_func()
# obj = A()
# obj.cls_func()
类方法: 一般就是通过类名去调用的方法,并且自动将类名地址传给cls,但是如果通过对象调用也可以,但是传的地址还是类名地址.

类方法有什么用???

1. 得到类名可以实例化对象.

2. 可以操作类的属性.

4.静态方法

使用装饰器@staticmethod。

# class A:
#
#     def func(self):
#         print('实例方法')
#
#
#     @classmethod
#     def cls_func(cls):
#         pass
#
#     @staticmethod
#     def static_func():
#         print('静态方法')

静态方法是不依赖于对象与类的,其实静态方法就是函数.

使用了静态方法(函数),然而方法体中并没使用(也不能使用)类或实例的属性(或方法)

保证代码的规范性,合理的划分.后续维护性高.

5.属性

class Bmi:

    def __init__(self,name,height,weight):

        self.name = name
        self.height = height
        self.weight = weight

    def bmi(self):
        return self.weight/self.height**2

obj = Bmi('赵嘎', 1.83, 65)
print(obj.bmi())
# 结果虽然实现了,但是逻辑上感觉不合理.bmi应该是类似于name,age,height,等名词,
# 但是你把它当做方法使用了.

class Bmi:

    def __init__(self,name,height,weight):

        self.name = name
        self.height = height
        self.weight = weight

    @property
    def bmi(self):
        return self.weight/self.height**2

obj = Bmi('赵嘎', 1.83, 65)
print(obj.bmi)
# property 将执行一个函数需要函数名()变换成直接函数名.
# 将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.
obj.bmi
obj.bmi
obj.bmi = 666

del obj.bmi

# property 他是一个组合.

class Foo:
    @property
    def bmi(self):
        print('get的时候运行我啊')

    @bmi.setter
    def bmi(self,value):
        print(value)
        print('set的时候运行我啊')
        # return 111  # 无法得到返回值

    @bmi.deleter
    def bmi(self):
        print('delete的时候运行我啊')
        # return 111  # 无法得到返回值

obj = Foo()
# obj.bmi
obj.bmi = 666 # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
# obj.bmi(666)
del obj.bmi
# 应用场景:
#     1, 面试会考一些基本的调用,流程.
#     2, 工作中如果遇到了一些类似于属性的方法名,可以让其伪装成属性.

# 设置属性的两种方式:
#     1, 利用装饰器设置属性.
class Foo:
    @property
    def bmi(self):
        print('get的时候运行我啊')

    @bmi.setter
    def bmi(self,value):
        print(value)
        print('set的时候运行我啊')
        # return 111  # 无法得到返回值

    @bmi.deleter
    def bmi(self):
        print('delete的时候运行我啊')
        # return 111  # 无法得到返回值

    # 2. 利用实例化对象的方式设置属性.

class Foo:
    def get_AAA(self):
        print('get的时候运行我啊')

    def set_AAA(self,value):
        print('set的时候运行我啊')

    def delete_AAA(self):
        print('delete的时候运行我啊')

    AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应

f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA

6.issubclass isinstance区别

# isinstance 判断的是对象与类的关系
class A:
    pass

class B(A):
    pass

obj = B()

# isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
# print(isinstance(obj, B))  # True
# print(isinstance(obj, A))  # True

# issubclass 类与类之间的关系

class A:
    pass

class B(A):
    pass

class C(B):
    pass

# issubclass(a,b) 判断的是 a类是否是b类 或者 b类派生类 的派生类.
# issubclass(a,b) 判断的是 a类是否是b类 子孙类.
# print(issubclass(B,A))
# print(issubclass(C,A))

课外了解

按照Python的一切皆对象理论,类其实也是一个对象,那么类这个对象是从哪里实例化出来的呢?

print(type('abc'))
print(type(True))
print(type(100))
print(type([1, 2, 3]))
print(type({'name': '太白金星'}))
print(type((1,2,3)))
print(type(object))

class A:
    pass
print(isinstance(A, type))      # True
print(isinstance(object,type))  # True
print(issubclass(type,object))      # True

type元类是获取该对象从属于的类,而type类比较特殊,Python原则是:一切皆对象,其实类也可以理解为'对象',而type元类又称作构建类,python中大多数内置的类(包括object)以及自己定义的类,都是由type元类创造的。而type类与object类之间的关系比较独特:object是type类的实例,而type类是object类的子类,这种关系比较神奇无法使用python的代码表述,因为定义其中一个之前另一个必须存在。所以这个只作为了解。

百万年薪python之路 -- 面向对象之所有属性及方法的更多相关文章

  1. 百万年薪python之路 -- 面向对象之继承

    面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...

  2. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

  3. 百万年薪python之路 -- 面向对象之三大特性

    1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...

  4. 百万年薪python之路 -- 面向对象之:类空间问题以及类之间的关系

    面向对象之:类空间问题以及类之间的关系 1.从空间角度研究类 1.何处添加对象属性 class A: def __init__(self,name): self.name = name def fun ...

  5. 百万年薪python之路 -- 面向对象初始

    面向对象初始 1.1 面向过程编程vs函数式编程 函数编程较之面向过程编程最明显的两个特点: 1,减少代码的重用性. 2,增强代码的可读性. 1.2 函数式编程vs面向对象编程 面向对象编程:是一类相 ...

  6. 百万年薪python之路 -- JS基础介绍及数据类型

    JS代码的引入 方式1: <script> alert('兽人永不为奴!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script src ...

  7. 百万年薪python之路 -- 数据库初始

    一. 数据库初始 1. 为什么要有数据库? ​ 先来一个场景: ​ 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...

  8. 百万年薪python之路 -- 并发编程之 协程

    协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...

  9. 百万年薪python之路 -- 前端CSS样式

    CSS样式 控制高度和宽度 width宽度 height高度 块级标签能设置高度和宽度,而内联标签不能设置高度和宽度,内联标签的高度宽度由标签内部的内容来决定. 示例: <!DOCTYPE ht ...

随机推荐

  1. 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践

    1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...

  2. 【linux】【jenkins】自动化运维六 构建生成备份

    push tag用于提交代码构建成功后push tag,以防提交代码报错,方便回滚之前正常的代码. 由于采用docker部署的形式,构建失败自动回滚还未实现,待研究解决. 构建后操作选择 Git Pu ...

  3. java算法基础范例

    题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?  1.程序分析: 兔子的规律为数列1,1,2,3 ...

  4. 删除pdf中的链接

    在Acrobat中打开pdf文件,然后:编辑→首选项→一般→自动从文本检测URL,把此处的对勾去掉,以后就不会变为食指按的形状了! 还有以下的方法 方法1:“高级(A)”→“链接(L)”→“删除文档中 ...

  5. windows无法安装到这个磁盘怎样解决,及激活

    在cmd输入.sql server 2008  slmgr.vbs -ipk KH2J9-PC326-T44D4-39H6V-TVPBY  这个问题遇到的挺多次的,依稀记得上次搞这个问题搞了很久,今天 ...

  6. 基于RHEL8/CentOS8的网络基础配置

    在rhel7上,同时支持network.service和NetworkManager.service(简称NM).默认情况下,这2个服务都有开启,但许多人都会将NM禁用掉.而在rhel8上,已废弃ne ...

  7. Redis数据库之服务器主从配置

    目的 主要培养对分布式REDIS主从复制架构运用的能力.理解并掌握REPLICATION工作原理的同时,能独立配置Replication ,使数据库运行在主从架格上.针对主从复制架构的运用,着力掌握S ...

  8. HTML5-常用正则表达式

    有关H5正则表达式的一些常用式子,希望热爱编程的同学们多多指教,还有也希望可以关注收藏本站哦!❤^_^❤ 一.校验数字的表达式 1. 数字:^[0-9]*$ 2. n位的数字:^\d{n}$ 3. 至 ...

  9. pikachu-数字型注入(post)#手工注入

    1, 因为是post型,所以需要抓取数据包 2, 测试结果为数字型注入 提交恒等的语句可以查询到所有的数据信息 3, 使用UNION联合查询法 判断字段数,测试为2个字段时没有报错,所以可以判断字段数 ...

  10. 正睿OI国庆day1

    正睿OI国庆day1 T1 \[ S_n=1*S_{n-1}+1*F_{n-1}+1*F_{n-2}+1*f_{n-1}+1*f_{n-2} \] \[ F_{n}=0*S_{n-1}+1*F_{n- ...