面向对象:封装 待续

1.封装:

广义上:把方法和属性根据类别装进类中。

狭义上:私有化的方法和属性。

    私有化:只能在类的内部可见,类的外部不可访问、查看

    私有化的内容:方法、静态变量、实例变量(对象属性)

A.私有化属性:

class Goods:
    def __init__(self,name,price):
        self.name=name
        self.__price=price     #私有属性

    def get_price(self):
        print(self.__price)
apple=Goods('苹果',20)
print(apple.name)
apple.get_price()             #只能在类的内部可见
apple.__price                  #类的外部不可见
结果:
苹果
20
  File "F:/pycharmproject/新建文件夹/day0329/demo.py", line 30, in <module>
    apple.__price
AttributeError: 'Goods' object has no attribute '__price'

B.私有化静态变量:

#私有化静态变量:
class Role(object):
    __country='China'     #私有化静态变量
    def fun(self):
        print(self.__country)
print(Role.__country)
结果:
AttributeError: type object 'Role' has no attribute '__country'


class Role(object):
    __country='China'     #私有化静态变量
    def fun(self):
        print(self.__country)
Role().fun()
结果:
China

C.私有化方法:

import hashlib
class Auth(object):
    def __init__(self,user,pwd):
        self.user=user
        self.pwd=pwd

    def __md5_code(self):
        md5=hashlib.md5(self.user.encode('utf-8'))
        md5.update(self.pwd.encode('utf-8'))
        return md5.hexdigest()

    def login(self):
        if 'alex'==self.user and 'ee838c58e5bb3c9e687065edd0ec454f' == self.__md5_code():
            return True
user=input('>>>')
pwd=input('>>>')
obj=Auth(user,pwd)
# obj._Auth__md5_code()   #这是调用了类内私有化方法  不建议使用
ret = obj.login()
if ret:
    print('登陆成功!')

结果:
>>>alex
>>>alex3714
登陆成功!

2.私有化怎么完成的?

 所有的私有的变化都是在类的[内部]定义的时候完成的

3.私有属性可以被继承吗?

示例一:

class Foo:
    def __init__(self):           #传参
        self.__func()

    def __func(self):
        print('in foo')

class Son(Foo):
    def __func(self):
        print('in son')

Son()
结果:
in foo

示例二:

class User:
    def func(self):
        self.__wahaha()  #在所有的空间里找不到 _User__wahaha

class VipUser(User):
    def __wahaha(self):
        print('in vip user')

VipUser().func()  #报错

示例三:

class User:
    def __wahaha(self):
        print('in user')

class VipUser(User):
    def func(self):
        self.__wahaha()

VipUser().func()           ## 报错,因为在命名空间中根本不存在一个_VipUser__wahaha
结果:
AttributeError: 'VipUser' object has no attribute '_VipUser__wahaha'
# 私有的这个概念 但凡在类的外面 都不能用
# 私有的所有内容 :实例变量(对象属性),静态变量(类变量),方法都不能被子类继承
# 公有的 在类的内部外部随便用 public
# 私有的 private 只能在类的内部使用 既不能被继承 也不能在类的外部使用

4.私有  和  @property 的一起用:

class Circle:
    def __init__(self,r):
        self.r=r
    @property
    def area(self):
        return 3.14*self.r**2
    @property
    def perimeter(self):
        return 3.14*self.r*2
c=Circle(4.5)
print(c.area)                #这里其实是调用的是函数  但是没有加上括号,类似属性一样的使
                                     用,这里就是property的功能
print(c.perimeter)
结果:
63.585
28.26
import time
class Person:
    def __init__(self,name,birth):
        self.name=name
        self.birth=birth
    @property
    def age(self):
        print(time.localtime(time.time()).tm_year-int(self.birth.split('-')[0]))


alex=Person('alex','1978-12-12')
alex.age
结果:
41

# 只能看 不能改

alex.age=54  去改变age  是会报错的      can't set attribute

那么想改变值怎么办???

5.@setter

class Goods:
    discount=0.85
    print('discount:',discount)
    def __init__(self,name,price):
        self.name=name
        self.__price=price
    @property                                      #只支持obj.price 查看结果,只能查看,不能修改,不能删除
    def price(self):
        return self.__price*self.discount           #这里调用静态变量要用self.变量或者Goods.变量

    @price.setter
    def price(self,value):
        self.__price=value

apple=Goods('苹果',10)
print(apple.price)
apple.price=50                                #对私有属性进行改变,调用被setter装饰的函数price
print(apple.price)                            #调用被property装饰的函数price
结果:
discount: 0.85
8.5
42.5

格式:

@property

def  函数名():
@函数名(保证相同).setter

def  函数名(保证相同)():

.

.

.

原文地址:https://www.cnblogs.com/Zhao159461/p/10622180.html