首页 > 代码库 > Python语言及其运用_第六章_对象和类

Python语言及其运用_第六章_对象和类

【主要内容】主要总结书中关于类和对象的简单程序,用于说明类的基本使用方法

                        注意:6.类中变量的私有保护    9.魔术方法

【基本知识】

1.类的基本定义

1 class Person():
2     def __init__(self,name):    #初始化方法,注意类中方法的第一个参数为表示自身的self
3              self.name = name
4 hunter = Person("Elmer Fudd")
5 print(hunter.name)

2.继承

1 class Car():
2          def exclaim(self):
3                   print("I‘m a car!")
4 
5 class Yugo(Car):
6          pass
7 give_me_a_yugo = Yugo()
8 give_me_a_yugo.exclaim()
9 #输出:I‘m a car!

3.覆盖

 1 class Car():
 2          def exclaim(self):
 3                   print("I‘m a car!")
 4 
 5 class Yugo(Car):
 6          def exclaim(self):
 7                   print("I‘m a yugo!")
 8 give_me_a_car = Car()
 9 give_me_a_yugo = Yugo()
10 give_me_a_car.exclaim()
11 give_me_a_yugo.exclaim()
12 #输出:I‘m a car!
13 #          I‘m a yugo!

4.添加新方法

 1 class Car():
 2          def exclaim(self):
 3                   print("I‘m a car!")
 4 
 5 class Yugo(Car):
 6          def exclaim(self):
 7                   print("I‘m a yugo!")
 8          def need_a_push(self):
 9                   print("A little help here?")
10 
11 give_me_a_car = Car()
12 give_me_a_yugo = Yugo()
13 #give_me_a_car.need_a_push()
14 give_me_a_yugo.need_a_push()

 

5.使用super调用父类的函数

   下面的例子中,子类将父类的__init__()方法覆盖,需要显示调用

 1 class Person():
 2     def __init__(self,name):
 3              self.name = name
 4 
 5 class EmailPerson(Person):
 6          def __init__(self,name,email):
 7                   super().__init__(name)
 8                   self.email = email
 9 
10 bob = EmailPerson("Bob Frapples","bob@frapples,com")
11 print(bob.name)
12 print(bob.email)

6.类的私有保护性

方法一、定义get和set方法后利用property()函数设置属性

 1 class Duck():
 2          def __init__(self, input_name):
 3                   self.hidden_name = input_name
 4          def set_name(self, input_name):
 5                   print("inside the setter")
 6                   self.hidden_name = input_name
 7          def get_name(self):
 8                   print("inside the getter")
 9                   return self.hidden_name
10          name = property(get_name,set_name)
11 
12 fowl = Duck("howard")
13 fowl.name
14 fowl.get_name()
15 fowl.set_name("Dafft")

通过property函数设置set和get函数可以设置新的name属性
但是,仍然可以通过hidden_name调用

方法二、使用装饰器

@property,用于指示getter方法
@name.setter,用于指示setter方法

 1 class Duck():
 2          def __init__(self, input_name):
 3                   self.hidden_name = input_name
 4          @property
 5          def name(self):
 6                   print("inside the getter")
 7                   return self.hidden_name
 8          @name.setter
 9          def name(self, input_name):
10                   print("inside the setter")
11                   self.hidden_name = input_name
12 fowl = Duck("howard")
13 fowl.name = "Donald"
14 print(fowl.hidden_name)

注意:仍然可以通过hidden_name调用

方法三、私有命名
#变量由连续两个下划线开头(__)

 1 class Duck():
 2          def __init__(self,input_name):
 3                   self.__name = input_name
 4          @property
 5          def name(self):
 6                   return self.__name
 7          @name.setter
 8          def name(self,input_name):
 9                   self.__name = input_name
10 
11 fowl = Duck("Marry")
12 print(fowl.name)
13 fowl.name = "Jack"
14 print(fowl.name)

注意:无法访问fowl.__name,但是可以通过fowl._Duck__name访问。

7.函数的类型

(1)实例方法:以self为第一个参数的方法。调用时会将调用该方法对象作为self参数传入。(参见上述函数)

(2)类方法:作用于整个类。用前缀@classmethod指定,第一个参数为类本身(cls)

 1 class A():
 2          count = 0
 3          def __init__(self):
 4                   A.count += 1
 5          @classmethod
 6          def kids(cls):
 7                   print("A has" , cls.count, "little objects.")
 8 
 9 a1 = A()
10 a2 = A()
11 a3 = A()
12 A.kids()

(3)静态方法:@staticmethod不影响类也不影响方法

1 class CoyoteWeapon():
2          @staticmethod
3          def commercial():
4                   print("This is a static method")
5 
6 CoyoteWeapon.commercial()

【思考】2、3其实就类似于C++中的static方法

8.多态

 1 class Quote():
 2          def __init__(self,person,word):
 3                   self.person = person
 4                   self.word = word
 5          def who(self):
 6                   return self.person
 7          def says(self):
 8                   return self.word+.
 9 
10 class QuestionQuote(Quote):
11          def says(self):
12                   return self.word+?
13          
14 class ExclamationQuote(Quote):
15          def says(self):
16                   return self.word+!
17 
18 class BabblingBrook():
19          def who(self):
20                   return "777"
21          def says(self):
22                   return "888"
23 
24 def printQuote(obj):
25          print(obj.who(), says:, obj.says())
26 
27 hunter1 = Quote("Quote1","Quote1")
28 hunter2  = QuestionQuote("QuestionQuote1","QuestionQuote1")
29 hunter3 = ExclamationQuote("ExclamationQuote1","ExclamationQuote1")
30 babblingbrook = BabblingBrook()
31 printQuote(hunter1)
32 printQuote(hunter2)
33 printQuote(hunter3)
34 printQuote(babblingbrook)

注:BabblingBrook不是子类但仍可以调用

9.魔术方法:类似于C++中的operator方法

1 class Word():
2          def __init__(self,text):
3                   self.text = text
4          def __eq__(self,word2):
5                   return self.text.lower() == word2.text.lower()
6 
7 first = Word("HA")
8 second = Word("ha")
9 print(first == second)

 

Python语言及其运用_第六章_对象和类