三. python面向對象(私有屬性和私有方法 私有靜態方法 私有類方法)


一. 私有屬性(封裝)

# 俠義 上的封裝  面向對象的三大特性之一
# 屬性 和 方法都隱藏起來  不讓你看到
# 如果要讓內部屬性不被外部屬性直接訪問    在屬性前加上兩個下划線__
# 在python中 如果在屬性前加上兩個下划線那么這個屬性就變成了私有屬性
# print(per.__money)  #在屬性前面加上__不能訪問內部屬性
class person(object):
    def eat(self ,food):
        print("eat-- " +food)
        print(self.__money)      # 在內部打印私有屬性

    def __init__(self,height ,weight ,money):
        # 定義屬性
        self.height =height
        self.weight =weight
        self.__money =money    #  定義私有屬性

per =person(300 ,100 ,20000)
per.age =1000000000000000000000000
print(per.age)  # 1000000000000000000000000
# print(per.__money)   # 在屬性前面加上__不能訪問內部屬性  會報錯   所以只要在內部訪問
per.eat("玻璃")


# 如果要讓內部屬性不被外部屬性直接訪問    在屬性前加上兩個下划線__   
# 在python中 如果在屬性前加上兩個下划線那么這個屬性就變成了私有屬性
# 如果你想被外部訪問內部屬性直接加上  __                   列如這里__money  

1. 修改私有屬性

class person(object):
    def __init__(self, height, weight, money):
        # 定義屬性
        self.height = height
        self.weight = weight
        self.__money = money
        # 通過內部的方法 修改私有屬性
        # 通過自定義的方法實現對私有屬性的賦值和取值
    def setMoney(self, money):
            # 數據過濾
            if money < 0:
                money = 0
            self.__money = money
    def getMoney(self):
            return self.__money

    def run(self):
        print(self.__money)  # 內部訪問     #22222222元

per = person( 300, 100, "22222222元")
per.run()#  22222222元

per.setMoney(100)

per.run() # 100
# 在python中 __xxx__屬於特殊變量 可以直接訪問的

class person(object):
    def __init__(self, height, weight, money):
        # 定義屬性
        self.__height__= height
        self.weight = weight
        self.__money = money
        # 通過內部的方法 修改私有屬性
        # 通過自定義的方法實現對私有屬性的賦值和取值
    def setMoney(self, money):
            # 數據過濾
            if money < 0:
                money = 0
            self.__money = money
    def getMoney(self):
            return self.__money

    def run(self):
        print(self.__money)  # 內部訪問     #22222222元
        print(self.__height__)   #300


per = person( 300, 100, "22222222元")
per.run()#  22222222元
per.setMoney(100)
per.run() # 100
print(per.__height__)   # 300

2.私有方法

class Per(object):
    __key=55555         #靜態屬性 也可以變成私有屬性
    def __init__(self,name,passwd,age):
        self.name=name
        self.__passwd=passwd     #  加上__ 私有屬性
        self.__age=age

    def get_pwd(self):
        print(self.__dict__)
        print(self.__key,"靜態私有屬性")
        return  self.__passwd      #   只有在類的內部使用私有屬性 就會自動的帶上 _類命



    def __agel(self):             # 加上__私有方法
        # print(self.__doc__)
        print("私有方法!!!!!!")
        return self.__age

    def login(self):                #內部調用私有方法    外部取不到

        self.__agel()
aa=Per("張三","123456",'222')

print(aa.get_pwd())
# {'name': '張三', '_Per__passwd': '123456', '_Per__age': '222'}
# 55555 靜態私有屬性
# 123456


print(aa.login())
# None
# 私有方法!!!!!!
# None

# print(aa._Per__passwd)  # 不能這么調用      單下划線   '_Per__age
# print(aa._Per__age)  # 不能這么調用      單下划線   '_Per__age
# # 123456
# # 222

aa.login()
# 私有方法!!!!!!
class Room(object):

    def __init__(self,name,length,width):
        self.name=name
        self.__length=length
        self.__width=width


    def area(self):
        print(self.__width)   #  10
        return  self.__length*self.__width

aa=Room("張三",22,10)

print(aa.area())  # 220

print(aa.__dict__)  # {'name': '張三', '_Room__length': 22, '_Room__width': 10}

print(aa._Room__width)   # 10
# 假設 父類的私有屬性 能被 子類 調用嗎    答案是 不能的         說明不能被繼承
class Foo:
    __key='1223'
class Son(Foo):
    print(Foo.__key)
# 私有方法的使用
class Gn(object):
   bar=11111
   def __init__(self,name,age):
       self.name=name
       self.age=age
   def __aa(self):        # 在前面加上  __ 就變成了私有方法   和私有屬性一樣  只能內部訪問  不能外部方法
       print(f'我叫--{self.name}--今年{self.age}')

   def __cc(self):
        print("卧槽11111111111111111111111111111111111111")

   def fn(self):
       self.__aa()
       self.__cc()

ss=Gn("王五",666)
ss.fn()


# 私有方法的使用
class Gn(object):
bar=11111
def __init__(self,name,age):
self.name=name
self.age=age
def __aa(self,v): # 在前面加上 __ 就變成了私有方法 和私有屬性一樣 只能內部訪問 不能外部方法
print(f'我叫--{self.name}--今年{self.age}',v)

def __cc(self):
print("卧槽11111111111111111111111111111111111111")

def fn(self):
self.__aa("這是私有方法哦")
self.__cc()

ss=Gn("王五",666)

ss.fn()
# 我叫--王五--今年666 這是私有方法哦
# 卧槽11111111111111111111111111111111111111
 

 私有的靜態方法@staticmethod

class Gn(object):
   bar=11111
   def __init__(self,name,age):
       self.name=name
       self.age=age
   def __aa(self,v):
       print(f'我叫--{self.name}--今年{self.age}',v)
   @staticmethod
   def __fn():
       print("我是靜態私有屬性哈哈哈哈哈")
   def cc(self):
       Gn.__fn()
ss=Gn("王五",666)
ss.cc()
# 我是靜態私有屬性哈哈哈哈哈

print("********************************************************88")

class Gn(object):
   bar=11111
   def __init__(self,name,age):
       self.name=name
       self.age=age
   def __aa(self,v):
       print(f'我叫--{self.name}--今年{self.age}',v)

   @staticmethod
   def __fn():
       print("我是靜態私有屬性哈哈哈哈哈")

   @staticmethod
   def stat():
       Gn.__fn()

ss=Gn("王五",666)
Gn.stat()
# 我是靜態私有屬性哈哈哈哈哈

  私有的類方法@staticmethod

class Gn(object):
   bar=11111

   @classmethod
   def __aa(cls,name):
       print(cls.bar)
       print("我是類方法!!!!!!!!")
       print(name)

   def bb(self):
       Gn.__aa("張三")
ss=Gn()
ss.bb()

# 11111
# 我是類方法!!!!!!!!
# 張三

print("********************************************************")

class Gn(object):
   bar=11111
   @classmethod
   def __aa(cls):
       print(cls.bar)
       print("我是類方法!!!!!!!!")

   @classmethod
   def bb(cls):
       Gn.__aa()
ss=Gn()
# ss.bb()
Gn.bb()
#
# 11111
# 我是類方法!!!!!!!!

 私有屬性方法@property

class Da(object):
    def aa(self):
        print("實例化")
    @property
    def __bb(self):
        print("私有屬性")

    @property
    def cc(self):
        c.__bb

c=Da()
c.cc
# 私有屬性
print("******************************************************************8")

class Da(object):
    def aa(self):
        print("實例化")
    @property
    def __bb(self):
        print("私有屬性")

    def cc(self):
          c.__bb
c=Da()
c.cc()
# 私有屬性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM