類成員

1、變量

1. 實例變量(字段)

  • 每一個實例都應該擁有的變量
  • 實例變量中隱含着一個建立這個對象的類。經過這個類就能找到類中定義的所有內容,包括方法和屬性信息等
  • 訪問:對象.變量名
class Person(object):

    def __init__(self, name, age):
        self.name = name  # 實例變量
        self.age = age    # 實例變量


p1 = Person("Tom", 18)
print(p1.name)  # Tom  訪問實例變量

p1.name = "Andy"  # 修改實例變量的值
print(p1.name)  # Andy

2. 類變量(靜態變量)

  • 直接寫在類中的變量,全部對象共享
  • 訪問:類名.變量名,對象.變量名(不推薦,且只能訪問,不能修改)
class Foo(object):
    count = 0  # 類變量

    def __init__(self):
        Foo.count += 1


print(Foo.count)    # 0 訪問類變量
Foo()
Foo()
Foo()
print(Foo.count)  # 3

2、方法

1. 成員方法(實例方法)

  • 對象直接訪問的方法
  • 訪問:對象.方法名()
class User(object):

    def login(self):  # 實例方法
        print("歡迎登陸")


u = User()
u.login()  # 調用實例方法

2. 類方法

  • cls指類自己,無論用對象仍是用類去訪問類方法,默認傳遞進去的是類
  • 調用:類名.方法名(),對象.方法名()(不推薦)

語法:函數

@classmethod
def 方法名(cls):
    pass
class Foo(object):

    @classmethod
    def add(cls, a, b):  # 類方法
        print(cls)
        return a + b


print(Foo)
print(Foo.add(1, 2))

結果:
<class '__main__.Foo'>
<class '__main__.Foo'>
3

3. 靜態方法

  • 當出現一個方法不須要使用到實例變量和類變量時,就能夠選擇使用靜態方法
  • 調用:類名.方法名(),對象.方法名()(不推薦)

語法:spa

@staticmethod
def 方法名.():
    pass
class Foo(object):

    @staticmethod
    def welcome():
        print("---Welcoming---")


Foo.welcome()  # ---Welcoming---
 
 

 

 

3、私有

    在Python中使用"__"做爲方法或者變量的前綴,那麼這個方法或者變量就是一個私有的code

    若是類中存在繼承關係,子類是沒法繼承父類的私有內容的對象

1. 私有變量

  • 私有變量不能直接訪問,但可經過在公共方法中訪問私有變量的值
  • 實例變量,類變量均可爲私有
class Person(object):

    def __init__(self, salary):
        self.__salary = salary

    def sal(self):
        print(self.__salary)


p1 = Person(50000)
print(p1.__salary)  # 報錯
p1.sal()  # 50000

 2. 私有方法

  • 私有方法只能在類中本身調用,類外面不能直接訪問,可定義公共方法,在公共方法中調用私有方法
  • 實例方法,類方法,靜態方法均可變爲私有
class Person(object):

    def __init__(self, name, salary):
        self.name = name
        self.__salary = salary

    def __sal(self):
        print(self.__salary)

    def display(self):
        self.__sal()


p1 = Person("Tom", 50000)
p1.display()  # 50000

4、屬性(@property)

  • 經過方法改造過來的一種變量的寫法

注意:blog

  • 方法參數只能有一個self
  • 調用時不須要寫括號,直接當成屬性變量
  • 須要有返回值
class Person(object):

    def __init__(self, name, birthday):
        self.name = name
        self.birthday = birthday

    @property
    def age(self):
        return 2018 - self.birthday


p = Person("Tom", 1994)
print(p.age)  # 24

增長方法,使之能夠賦值:繼承

class Test(object):

    def __init__(self):
        self.__num = 100

    @property
    def num(self):
        return self.__num

    @num.setter
    def num(self, new_num):
        self.__num = new_num


t = Test()
print(t.num)  # 100
t.num = 50
print(t.num)  # 50

 property另外一種表達方式:內存

    property(fget=None, fset=None, fdel=None, doc=None)get

  • fget:獲取屬性值的函數。
  • fset:設置屬性值的函數。
  • fdel:刪除屬性值的函數。
  • doc:爲該屬性建立一個docstring。
class Test(object):

    def __init__(self):
        self.__num = 100

    def getnum(self):
        return self.__num

    def setnum(self, new_num):
        self.__num = new_num

    num = property(getnum, setnum)


p1 = Test()
print(p1.num)  # 100
p1.num = 50
print(p1.num)  # 50

5、類特殊成員

1)  __new__()

  • 構造方法
  • 在建立對象時,系統自動先執行__new__()來開闢內存,此時新開闢出來的內存區域是空的

2) __init__()

  • 初始化
  • 在__new__()調用完後,緊接着系統自動調用__init__()來完成對象的初始化工做

3) __str__()

  • 獲取對象的描述信息
  • 觸發:print(對象)

4) __repr__()

  • 調用:print(repr(對象))

5) __call__()

  • 觸發:對象()string

6) __del__()

  • 在刪除對象或者程序結束,對象內存空間刪除時,系統都會自動調用一次del方法

7) __getitem__()

  • 觸發:對象[key]

8) __setitem__()

  • 觸發:對象[key] = value

9) __delitem__()

  • 觸發:del 對象[key]

10) __add__()

  • 觸發:對象 + 對象 

11) __enter__()

  • 觸發:with 對象 as 變量:

12) __exit__()

  • 觸發:with 對象 as 變量:退出時

13) __iter__()

  • 觸發:當遍歷對象時

14) __hash__()

  • 調用:print(hash(對象))

15) __gt__()

  • 觸發:對象1 > 對象2

16) __lt__()

  • 觸發:對象1 < 對象2

17) __ge__()

  • 觸發:對象1 >= 對象2
相關文章
相關標籤/搜索