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) # 10
print(p.age)      # 10

p.age += 5 #    p.age = p.age + 5
#   要理解这个在对象和类的操作方法:首先是计算右边的值,p.age 在对象p中没有,所以他要到类中去取age = 10
#   然后变成10+5 = 15, 然后在p对象中新增加个age属性(以前说过,对象没有就是新增,有的话就是修改)

print(Person.age) # 10
print(p.age)      # 15

#   __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("123")  #这里必须要有个参数,才能调用成功
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)    #   有错误

原文地址:https://www.cnblogs.com/delphiclub/p/8495254.html

时间: 2024-10-14 10:44:08

Python 私有化属性的相关文章

十七、python 私有化和魔法属性

1.python私有化 xx:公有变量 _x:单前置下划线,私有化属性或方法,from module import * 禁止导入,但是类对象和子类可以访问. __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到) __xx__:双前后下划线,用户名字空间的魔法对象或属性. xx_:单后置下划线,用于避免与python关键词的冲突. 通过name mangling(名字重整的目的就是以防子类意外重写基类的方法或者属性). 通过_Class__object机制

python3 私有化 属性property

私有化 xx:公有变量 _x:单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到) __xx__:双前后下划线,用户名字空间的魔法对象或属性.例如__init__,不要自己发明这样的名字. xx_:单后置下划线,用于避免与Python关键值字冲突. #! /usr/bin/env python3 class Person(object): de

Python类属性访问的魔法方法

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

python 对象属性与 getattr &amp; setattr

Python对象的属性可以通过obj.__dict__获得,向其中添加删除元素就可以实现python对象属性的动态添加删除的效果,不过我们应该使用更加正规的getattr和setattr来进行这类操作 getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the ob

js私有化属性

我们先来看一个例子: var Demo1 = function(val){ this.value = val; this.getValue = function(){ return this.value; } }; var demo1Obj = new Demo1(1); alert(demo1Obj.value); // 1 demo1Obj.value = 0; alert(demo1Obj.getValue()); // 0 Demo1的对象都会有一个value属性,在new的时候进行初始

Python函数属性

Python函数属性 python函数属性是全局的 注意:如果在使用函数前调用函数属性,会触发AttributeError异常 def add(x=2): try: add.sum += x except AttributeError: add.sum = x add() #如果没有运行此句,会触发 AttributeError异常 print(add.sum) # 输出:2 add.sum = 5 print(add.sum) # 输出:5 add(6) print(add.sum) # 输出

Python类属性和类方法

01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两步: 1) 在内存中为对象 分配空间 2) 调用初始化方法 __init__ 为 对象初始化 对象创建后,内存 中就有了一个对象的 实实在在 的存在 —— 实例 因此,通常也会把: 创建出来的 对象 叫做 类 的 实例 创建对象的 动作 叫做 实例化 对象的属性 叫做 实例属性 对象调用的方法 叫做 实例方法 在程序执行时: 对象各自拥有自己的 实例属性 调用对象方

【python】属性

在python中,一切皆是对象(object),对象拥有很多属性(arrtribute) 属性分2种 类属性(class attribute):类自身定义or继承 对象属性(object attribute):该对象实例定义的 保留属性:(=对象属性??) >>> Class1.__doc__ # 类型帮助信息 'Class1 Doc.' >>> Class1.__name__ # 类型名称 'Class1' >>> Class1.__module__

python request属性及方法说明

if  request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属      性 描述 path 表示提交请求页面完整地址的字符串,不包括域名,如"/music/bands/the_beatles/". method 表示提交请求使用的HTTP方法.它总是大写的.例如: if request.method == 'GET': do_something() elif request.metho