Python 私有化属性
# 对象的基本理论
# 什么事对象?
# 万物皆对象
# 对象是具体物体
# 拥有属性
# 拥有行为
# 把很多零散的东西,封装成为一个整体
# 举例:王二小
# 属性
# 姓名
# 年龄
# 身高
# 体重
# 行为
# 走路
# 吃饭
# 放羊
# Python中的体现
# 是一门特别彻底的面向对象编程(OOP)的语言
# 其他语言:基本数据类型,对象类型
# python全部类型都是对象类型
# 面向对象是面向过程的封装
# 对象和类的关系:对象 可以抽象为类 类可以实例化为对象 class Money:
pass print(Money) #<class '__main__.Money'>
one = Money()
print(one, type(one)) #<__main__.Money object at 0x030CFBB0> <class '__main__.Money'> class Person:
pass # 对象的操作:增
p = Person()
# 查看对象的所有属性
print(p.__dict__) #{}
p.age = 18
p.height = 180
print(p.__dict__) #{'age': 18, 'height': 180} # 对象的操作:删
del p.age # 对象的操作:改
p.height = 185 # 对象里面如果有这个属性,就是修改,否则就是增加这个属性 # 类里面的 __dict__ 不可以修改,只读的
# 对象里的 __dict__ 可以修改
class Test:
age = 18 #Test.__dict__["age"] = 20 #TypeError: 'mappingproxy' object does not support item assignment one = Test() one.__dict__ = {"name":"abc", "height":180} #就是说__dict__字典里面生存储属性的变量
print(one.__dict__) #{'name': 'abc', 'height': 180} # 理解下面的内容
class Person:
age = 10 p = Person() print(Person.age) #
print(p.age) # p.age += 5 # p.age = p.age + 5
# 要理解这个在对象和类的操作方法:首先是计算右边的值,p.age 在对象p中没有,所以他要到类中去取age = 10
# 然后变成10+5 = 15, 然后在p对象中新增加个age属性(以前说过,对象没有就是新增,有的话就是修改) print(Person.age) #
print(p.age) # # __slot__
class Person:
__slots__ = {"age"} #只可以加入age的属性 p1 = Person()
p1.age = 18
print(p1.age) # 方法:实例方法,类方法,静态方法 class Person:
def eat(self):
print("这是个实例方法", self) @classmethod
def eat2(cls):
print("这是个类方法", cls) @staticmethod
def eat3():
print("这是个静态方法") p = Person()
print(p)
p.eat()
p.eat2()
p.eat3()
# <__main__.Person object at 0x032F54F0>
# 这是个实例方法 <__main__.Person object at 0x032F54F0>
# 这是个类方法 <class '__main__.Person'>
# 这是个静态方法
print("-" * 30)
#另外的调用方式:
Person.eat("") #这里必须要有个参数,才能调用成功
Person.eat2()
Person.eat3() print("-" * 30)
# 实例方法,类方法,静态方法的访问权限问题(包括类属性,实例属性)
class Person:
age = 10
# 实例方法
def shilie(self):
print(self)
print(self.age)
print(self.num) # 类方法
@classmethod
def leifangfa(cls):
print(cls)
print(cls.age)
print(cls.num) # 不可以使用实例属性 # 静态方法
@staticmethod
def jingtai():
print(Person.age) # 能使用类里面的属性,但很少这样去调用的 p = Person()
p.num = 11 p.shilie() # 实例方法:可以调用实例属性和类属性
#p.leifangfa() # 类方法:不可以使用实例属性
p.jingtai() # 静态方法:可以使用类属性,不可以使用实例属性 # 元类
num = 123
str = "abc"
print(num.__class__.__class__) # <class 'type'>
print(str.__class__.__class__) # <class 'type'>
print(Person.__class__) # <class 'type'>
print(Person.__class__.__class__)# <class 'type'>
print(p.__class__.__class__) # <class 'type'> # ----------------------------另外一种创建类的方式-------------------------
def run(self):
print(self) dog = type("Dog",(),{"name":"abc","run":run}) #字典里面可以是类属性,或者类方法
print(dog.name) #abc
print(dog.run) #<function run at 0x02B56C90> # ---------------------------类的创建流程---------------------------------- class Animal:
# __metaclass__ = xxx
pass class Person(Animal):
# __metaclass__ = xxx
pass # -------------------------类的描述, pydoc 模块---------------------------------------
class Person:
"""
关于类的描述,类的左右,类的构造函数
Attribute:
属性的描述
"""
def run(self, distence, step):
"""
函数的作用
:param distence:参数含义,数据类型,默认值
:param step:
:return: 返回值类型
"""
return distence / step # help(Person) # 可以这样看帮助文档 # ------------------------ 私有化属性(类的内部,子类内部,模块内部,模块外部)4大块 ------- class Animal:
x = 10
_y = 20
__z = 30
def test(self):
print(Animal.x)
print(self.x)
print(Animal._y)
print(self._y)
print(Animal.__z)
print(self.__z)
print("-" * 30) class Dog(Animal):
def test2(self):
print(Dog.x)
print(self.x)
print(Dog._y)
print(self._y)
# print(Dog.__z) # 错误
# print(self.__z) # 错误
print("-" * 30) # 类的内部访问
a = Animal()
a.test() # 成功打印x # 子类的内部访问
d = Dog()
d.test2() # 成功打印x # 模块内部访问
# print(Animal.x) # 成功打印x
# print(Dog.x) # 成功打印x
# print(a.x) # 成功打印x
# print(d.x) # 成功打印x
# print(a.__z) # 有错误
#
# print(Animal._y) # 成功打印_y,但有警告
# print(Dog._y) # 成功打印_y,但有警告
# print(a._y) # 成功打印_y,但有警告
# print(d._y) # 成功打印_y,但有警告
# print(a.__z) # 有错误
# print(d.__z) # 有错误 print(Animal.__dict__)
print(Animal._Animal__z) # 伪私有 30
# 模块外的访问
import public
print(public.num) # 成功打印num
print(public._num2) # 另外一种模块导入方法
from public import *
# 直接写public 模块中的变量
print(num) # 成功打印num
# print(_num2) # 有错误
Python 私有化属性的更多相关文章
- Python——私有化 和 属性property
Python——私有化 和 属性property 一.私有化 xx: 公有变量 _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 ...
- 【代码学习】PYTHON 私有化
一.私有化 xx: 公有变量_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问__xx:双前置下划线,避免与子类中的属性命名冲突,无 ...
- 私有化 : _x: 单前置下划线,私有化属性或方法;__xx:双前置下划线;__xx__:双前后下划线;属性property
私有化 xx: 公有变量 _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 __xx:双前置下划线,避免与子类中的属性命名冲突,无 ...
- python 类属性与方法
Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...
- python 类属性和实例属性
class AAA(): aaa = 10 # 情形1 obj1 = AAA() obj2 = AAA() print obj1.aaa, obj2.aaa, AAA.aaa # 情形2 obj1.a ...
- js私有化属性
我们先来看一个例子: var Demo1 = function(val){ this.value = val; this.getValue = function(){ return this.valu ...
- python类属性和类方法(类的结构、实例属性、静态方法)
类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...
- 关于Python类属性与实例属性的讨论
标题名字有点长. 之所以想写这个文章是因为碰巧看到网上一篇关于Pyhon中类属性及实例属性区别的帖子.因为我之前也被这个问题困扰过,今天碰巧看到了这篇帖子,发现帖子的作者只是描述了现象,然后对原因的解 ...
- javascript 私有化属性,和公共属性
function TestClassA(name, number) { this.name = name; //public this.number = number; //public var ac ...
随机推荐
- SurvivalShooter学习笔记(四.敌人攻击)
此案例中,敌人始终朝着玩家移动 到达攻击玩家范围时(身上的大的触发器被玩家触发时(敌人靠近玩家,当身上的触发器被触发,且对象是玩家时条件达成)) 隔一个时间端,打击玩家一下,对玩家造成伤害,玩家掉血, ...
- mongodb在32位机的连接
Windows 32bit版本安装Mongodb时,会发生的下面问题 2016-05-09T00:09:45.124+0800 I STORAGE [initandlisten] exception ...
- HDU 3578 Greedy Tino(双塔DP)
Greedy Tino Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- C# WinForm 只运行一次的MDI子窗体
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void ToolColle ...
- 关于ajax里边不能识别$(this)的解决方法
在ajax外面弄个变量var mythis = $(this),然后在里面用就行
- jenkins 升级
升级Jenkins Jenkins的开发迭代非常快,每周发布一个开发版本,长期支持版每半年更新一次(ps:大版本更新).如此频繁的更新,怎么升级呢? war:下载新版的war文件,替换旧版本war文件 ...
- 在启动MYSQL时出现问题:“ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)”
1.问题描述 在启动MYSQL时出现问题:"ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)& ...
- 【我的Android进阶之旅】Android Studio如何轻松整理字符串到string.xml中
使用Android Studio一段时间了,还有很多小技巧没有掌握.比如:平常将字符串整理到string.xml中,都是手动的去复制字符串到string.xml中,然后再回来修改引用该字符串的代码,这 ...
- springMvc获取特殊值
1.获取数组
- linux下Tomcat shutdown无效
问题: linux下Tomcat shutdown无效 linux下关闭tomcat后,发现重新启动Tomcat后.port号提示被占用, 原因: 这时可能是项目中的后台线程或者socket依旧在执行 ...