zoukankan      html  css  js  c++  java
  • 面向对象 公有私有 property classmethod staticmethod

    接口类(抽象类)--------就是一种规范

    面向对象的私有与公有

    对于每一个类的成员而言都有两种形式:

    • 公有成员,在任何地方都能访问
    • 私有成员,只有在类的内部才能方法

    私有成员和公有成员的访问限制不同

    静态字段(静态变量)

    • 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
    • 私有静态字段:仅类内部可以访问;
    class C:
    
        name = "公有静态字段"
    
        def func(self):
            print C.name
    
    class D(C):
    
        def show(self):
            print C.name
    
    
    C.name         # 类访问
    
    obj = C()
    obj.func()     # 类内部可以访问
    
    obj_son = D()
    obj_son.show() # 派生类中可以访问
    公有实例
    class C:
    
        __name = "私有静态字段"
    
        def func(self):
            print C.__name
    
    class D(C):
    
        def show(self):
            print C.__name
    
    
    C.__name       # 不可在外部访问
    
    obj = C()
    obj.__name  # 不可在外部访问
    obj.func()     # 类内部可以访问   
    
    obj_son = D()
    obj_son.show() #不可在派生类中可以访问 
    私有实例

    普通字段(对象属性)

    • 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
    • 私有普通字段:仅类内部可以访问;
    class C:
        
        def __init__(self):
            self.foo = "公有字段"
    
        def func(self):
            print self.foo  # 类内部访问
    
    class D(C):
        
        def show(self):
            print self.foo # 派生类中访问
    
    obj = C()
    
    obj.foo     # 通过对象访问
    obj.func()  # 类内部访问
    
    obj_son = D();
    obj_son.show()  # 派生类中访问
    View Code
    class C:
        
        def __init__(self):
            self.__foo = "私有字段"
    
        def func(self):
            print self.foo  # 类内部访问
    
    class D(C):
        
        def show(self):
            print self.foo # 派生类中访问
    
    obj = C()
    
    obj.__foo     # 通过对象访问    ==> 错误
    obj.func()  # 类内部访问        ==> 正确
    
    obj_son = D();
    obj_son.show()  # 派生类中访问  ==> 错误
    View Code

    方法:

    • 公有方法:对象可以访问;类内部可以访问;派生类中可以访问
    • 私有方法:仅类内部可以访问;
    class C:
    
        def __init__(self):
            pass
        
        def add(self):
            print('in C')
    
    class D(C):
    
        def show(self):
            print('in D')
            
        def func(self):
            self.show()
    obj = D()
    obj.show()  # 通过对象访问   
    obj.func()  # 类内部访问    
    obj.add()  # 派生类中访问  
    View Code
    class C:
    
        def __init__(self):
            pass
    
        def __add(self):
            print('in C')
    
    class D(C):
    
        def __show(self):
            print('in D')
    
        def func(self):
            self.__show()
    obj = D()
    obj.__show()  # 通过不能对象访问
    obj.func()  # 类内部可以访问
    obj.__add()  # 派生类中不能访问
    View Code

    总结:

    对于这些私有成员来说,他们只能在类的内部使用,不能再类的外部以及派生类中使用.

    ps:非要访问私有成员的话,可以通过 对象._类__属性名,但是绝对不允许!!!

    为什么可以通过._类__私有成员名访问呢?因为类在创建时,如果遇到了私有成员(包括私有静态字段,私有普通字段,私有方法)它会将其保存在内存时自动在前面加上_类名.

    property属性

    property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

    例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
    
    成人的BMI数值:
    过轻:低于18.5
    正常:18.5-23.9
    过重:24-27
    肥胖:28-32
    非常肥胖, 高于32
      体质指数(BMI)=体重(kg)÷身高^2(m)
      EX:70kg÷(1.75×1.75)=22.86
    
    
    
    class People:
        def __init__(self,name,weight,height):
            self.name=name
            self.weight=weight
            self.height=height
        @property
        def bmi(self):
            return self.weight / (self.height**2)
    
    p1=People('egon',75,1.85)
    print(p1.bmi)
    实例

    属性:将方法伪装成属性,虽然在代码上没有任何高深之处,但是让其看起来更合理.

    将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

    由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

    class Goods(object):
    
        def __init__(self):
            # 原价
            self.original_price = 100
            # 折扣
            self.discount = 0.8
    
        @property
        def price(self):
            # 实际价格 = 原价 * 折扣
            new_price = self.original_price * self.discount
            return new_price
    
        @price.setter
        def price(self, value):
            self.original_price = value
    
        @price.deltter
        def price(self, value):
            del self.original_price
    
    obj = Goods()
    obj.price         # 获取商品价格
    obj.price = 200   # 修改商品原价
    del obj.price     # 删除商品原价
    setter deleter 实例

    classmethod

    class Classmethod_Demo():
        role = 'dog'
    
        @classmethod
        def func(cls):
            print(cls.role)
    
    Classmethod_Demo.func()
    实例

    类名调用类方法,自动将类的空间传给类方法中的cls,不用传参.

    staticmethod

    class Staticmethod_Demo():
        role = 'dog'
    
        @staticmethod
        def func():
            print("当普通方法用")
    
    Staticmethod_Demo.func()
    实例

    在类中定义一个静态方法,无需传入你的类空间,对象空间,可以当成普通函数使用

    class Foo:
        def func(self):
            print('in father')
    
    
    class Son(Foo):
        def func(self):
            print('in son')
    
    s = Son()
    s.func()
    # 请说出上面一段代码的输出并解释原因?
    练习
    class A:
        __role = 'CHINA'
        @classmethod
        def show_role(cls):
            print(cls.__role)
    
        @staticmethod
        def get_role():
            return A.__role
    
        @property
        def role(self):
            return self.__role
    
    a = A()
    print(a.role)
    print(a.get_role())
    a.show_role()
    # __role在类中有哪些身份?
    # 以上代码分别输出哪些内容?
    # 这三个装饰器分别起了什么作用?有哪些区别?
    练习
  • 相关阅读:
    筱玛的迷阵探险(折半搜索+01字典树)
    递推
    thin mission 2021 10 8
    4级 -- 阅读
    c++——小知识
    stl
    string
    ting mission 2021.9.20
    ting mission 2021.9.27
    欧拉函数
  • 原文地址:https://www.cnblogs.com/dalaoban/p/9272491.html
Copyright © 2011-2022 走看看