1. 程式人生 > >類的特性

類的特性

傳參 line 成員 ror .sh color highlight 調用 say

一、概述

1.定義類(class Dog(object))--> 實例化(d = Dog())---> 實例對象(d)

2. __init__() 構造函數

3. self.name = name 類的屬性、成員變量

4. def say_hi() 類的方法 、動態屬性

二、訪問類的屬性

class Role(object):
    def __init__(self, name, role, weapon, life_value=100, money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("%s is shooting..." % self.name)

    def got_shot(self):
        print("ah...,%s got shot..." % self.name)

    def buy_gun(self, gun_name):
        print("%s just bought %s" % (self.name,gun_name))


r1 = Role(‘Alex‘, ‘police‘, ‘AK47‘)  # 生成一個角色
r2 = Role(‘Jack‘, ‘terrorist‘, ‘B22‘)   # 生成一個角色

  

  2.1 訪問類的屬性和方法

  我們用 實例對象.屬性/方法 來訪問

r1.shot()    #  調用shot 方法
r2.buy_gun(‘B13‘)  # 調用 buy_gun的方法並傳參
print(r1.role)   # 打印類的屬性

# 輸出

Alex is shooting...
Jack just bought B13
police

 

  2.1 修改對象的屬性

  在上例中我們為r2這個角色更換了武器,即 B22 --> B13。但實際上我們調用r2這個角色的武器屬性是,會發現他的武器沒有改變:

r2.buy_gun(‘B13‘)
print(r2.weapon)

# 輸出
Jack just bought B13
B22       # 可以發現武器依然是 B22

  其實我們可以在購買武器是直接改變對象的屬性:

def buy_gun(self, gun_name):
      print("%s just bought %s" % (self.name, gun_name))
      self.weapon = gun_name    # 在方法內改變屬性



r2.buy_gun(‘B13‘)
print(r2.weapon)

#輸出
Jack just bought B13
B13    # 可以發現武器已經改變

  

三、私有屬性

  3.1、定義私有屬性

  類的屬性一旦被定義成私有屬性,就不能被外部調用和隨意修改。私有屬性只能在類是內部使用。

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.__address = address   # 定義一個私有屬性

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)
print(p1.name)
print(p1.__address)   # 訪問私有屬性

# 輸出

Bigberg
  File "G:/python/untitled/study6/類的私有屬性.py", line 17, in <module>
    print(p1.__address)
AttributeError: ‘Person‘ object has no attribute ‘__address‘

  運行的結果是訪問屬性name是可以通過的,但是直接訪問私有屬性 self.__address 報錯了。但是如果通過其他的方法,還是可以訪問的到的。

  3.2、get的方法訪問私有屬性

  外部不能直接訪問私有屬性,但是在類的內部可以訪問,所以我們可以定義一個方法來獲取私有屬性。  

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.__address = address

    def get_private(self):
        return self.__address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)
res = p1.get_private()
print(res)

# 輸出
hz

  

  3.3 強制訪問私有屬性

  我們還可以通過一種方法來強制訪問私有屬性,甚至修改私有屬性的值。方法:對象名._類名__屬性名。

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.__address = address

    def get_private(self):
        return self.__address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person(‘Bigberg‘, ‘Doctor‘, ‘8833421‘, ‘hz‘)

print(p1._Person__address)   # 訪問私有屬性

print("----change----")
p1._Person__address = ‘BJ‘    # 修改私有屬性
print(p1._Person__address)

#輸出
hz
----change----
BJ

  

四、總結

1、定義私有屬性:self.__private_attr_name = private_attr_name

2、強制訪問私有屬性:對象名._類名__屬性名(d._dog__sex)

3、對外提供只讀接口訪問:

    def get_sex(self):

      return self.__sex

類的特性