The memo blog.

About programming language and useful library.

Python: GUI Programming-II

| Comments

最近找了一些關於Google map應用的Python程式,除了加強自己的Python技巧也多參考一下別人怎樣寫。之後要來研究一下PIL:Python Image Library,安裝其實很簡單,只要用brew install pil就搞定,該怎樣用?之後會再來慢慢研究,這邊只是提到有這東西,不過好像許久沒有更新,看他網頁介紹說新版快要出了,也不知道多快XD。這次Python練習主題應該是要熟悉一下Object-Oriented怎樣在Python上面使用。雖然參考的書是Python3不過應該沒差吧!其實還有像是怎樣建立或是打包package(模組)感覺也很重要。這次打算延續上次寫的GUI,然後加入怎樣寫OO的程式。 主程式長成這樣,就弄個文字介面的就好。拿書本上的練習來打打字也沒有什麼特別,不過想要用其他寫好的模組,似乎只要import之後就可以用了。

ConsoleMain.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'''
Created on 2013/2/3

@author: CYChiang
'''
import Shape
if __name__ == '__main__':
    a = Shape.Point()
    b = Shape.Point(3, 4)
    print("a = Shape.Point")
    print("repr(a) = ", repr(a))
    print("b = Shape.Point(3, 4)")
    print("repr(b) = ", repr(b))
    print("str(b) = ", str(b))
    print("b.distance_from_origin = ", b.distance_from_origin())
    b.x = -19
    print("b=-19, str(b) = ", str(b))
    if a == b:
        print("Point a equal b")
    if a != b:
        print("Point a not equal to b")

在class程式當中有很多OO的東西,看了一下書,好像是屬於Object類別裡面預設的東西。我嘗試把str拿掉,出來的結果還是跟有加入str寫的東西一樣,所以我覺得這應該是內建的method來協助class之間的運算,除了這裡面寫的這些,google一下好像也有很多OO的方法在Object裡面。

Shape.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'''
Created on 2013/2/3

@author: CYChiang
'''
import math

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    def distance_from_origin(self):
        return math.hypot(self.x, self.y)
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    def __repr__(self):
        return "Point({0.x!r}, {0.y!r})".format(self)
    def __str__(self):
        return "({0.x!r}, {0.y!r})".format(self)

感覺好像也沒有什麼特別的,以上是class基本的實作,接下來弄個繼承。在繼承上練習的時候,書本程式碼竟然不會過…Google一下好像是什麼oldstyle的問題,暫時不太想理會,總之找到了另外一個繼承的方式。

Shape.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Circle(Point):
    radius = 0
    def __init__(self, radius=0, x=0, y=0):
        #super().__init__(x, y)
        #super(Circle, self).__init__(x, y)
        Point.__init__(self, x, y)
        self.radius = radius
    def edge_distance_from_origin(self):
        return abs (self.distance_from_origin - self.radius)
    def area(self):
        return math.pi * (self.radius ** 2)
    def circumference(self):
        return 2 * math.pi * self.radius
    def __eq__(self, other):
        return self.radius == other.radius and super().__eq__(other)
    def __repr__(self):
        return "Circle({0.radius!r}, {0.x!r}, {0.y!r})".format(self)
    def __str__(self):
        return repr(self)

有問題的點就是在super().__init__(x, y)super(Circle, self).__init__(x, y)依照說明在class建立的時候會去呼叫init的內容,算建構式吧!那在super那裡應該是繼承Point裡面的建構x, y這兩個值才對。但是怎樣用在super().__init__(x, y)super(Circle, self).__init__(x, y)一定噴錯給你。最後發現要用Point.__init__(self, x, y)這應該是先呼叫Point的建構,總之,可行,以後再來慢慢想怎樣解決這問題。接下來的Code是加入數字檢查是不是為正和不為0,備忘一下。assert “條件”, "不成立輸出"

Shape.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
'''
Created on 2013/2/3

@author: CYChiang
'''
import math

class Point(object):
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    def distance_from_origin(self):
        return math.hypot(self.x, self.y)
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    def __repr__(self):
        return "Point({0.x!r}, {0.y!r})".format(self)
    def __str__(self):
        return "({0.x!r}, {0.y!r})".format(self)
    @property
    def x(self):
        return self.__x
    @property
    def y(self):
        return self.__y
    @x.setter
    def x(self, x):
        assert x > 0, "must be nonzero and non-negative"
        self.__x = x
    @y.setter
    def y(self, y):
        assert y > 0, "must be nonzero and non-negative"
        self.__y=y


class Circle(Point):
    radius = 0
    def __init__(self, radius=0, x=0, y=0):
        #super().__init__(x, y)
        #super(Circle, self).__init__(x, y)
        Point.__init__(self, x, y)
        self.radius = radius
    @property
    def edge_distance_from_origin(self):
        return abs(self.distance_from_origin - self.radius)
    @property
    def area(self):
        return math.pi * (self.radius ** 2)
    def circumference(self):
        return 2 * math.pi * self.radius
    def __eq__(self, other):
        return self.radius == other.radius and super().__eq__(other)
    def __repr__(self):
        return "Circle({0.radius!r}, {0.x!r}, {0.y!r})".format(self)
    def __str__(self):
        return repr(self)
    @property
    def radius(self):
        return self.__radius
    @radius.setter
    def radius(self, radius):
        assert radius > 0, "must be nonzero and non-negative"
        self.__radius = radius

突然覺得如果加入一些有的沒得檢查,長度會變的有點長…不過也還好。以後再來想要怎樣精簡或是有沒有其他檢查的方式。之後想要來練習寫一下檔案處理之類的還有研究一下別人的code,看能不能寫出什麼比較有趣的東西。

Comments