Python面向对象的编程注意细节

和前文一样,这了也是学习过程中,来源于网上各种资料的一个整合记录,希望能够帮到自己和大家;

主要的关注点是在使用class的时候,应该注意的一些细节;

1.在class里面,有了 __init__(self,...)函数之后,构造对象就不能用空的参数了,相当于java里面有了构造函数之后就不能使用默认的构造函数了;

2.__init__(self,...)函数的第一个参数永远是默认的self,调用的时候不用传入;

3.python允许对象实例化以后动态的绑定任何数据,所以同一个类的不同实例可能有不同的属性:

   #对象可以随意绑定对象,所以同一个类的不同实例可以拥有不同的属性;

         Jack.age = 17
         print(Jack.age)
        #Robin对象没有属性age,下面的语句就会报错
        #print(Robin.age)

4.python里面,类中的变量如果不想被外面访问,就用 __name,__score,即在变量名字前面加上俩个下划线,但是 __name__ 这样的变量是特殊变量,是可以被访问的;

5.python是一种动态的语言,java是一种静态的语言,在多态问题上就可以看出来,python只需要调用函数的对象有同名的方法即可,不管是否是原来对象的子类;

 1 # -*- coding: utf-8 -*-
 2
 3 ‘test class 多态‘
 4
 5 class Animal(object):
 6     def run(self):
 7         print("Animal is running...")
 8
 9 class Cat(Animal):
10     def run(self):
11         print("Cat is running...")
12
13 class Dog(Animal):
14     def run(self):
15         print(‘Dog is running...‘)
16
17 animal = Animal()
18 cat = Cat()
19 dog = Dog()
20 animal.run()
21 cat.run()
22 dog.run()
23
24 #判断对象的数据类型,便于理解多多态的概念
25 print(isinstance(cat, Cat))
26 #说明cat对象不仅仅是Cat的实例,也是Animal的实例;
27 print(isinstance(cat, Animal))
28 #但是Animal就不是cat 或者dog
29 print(isinstance(animal, Cat),isinstance(animal, Dog))
30
31 #多态:编写一个函数,根据传入的对象的不同类型,调用对应的run()函数;
32 def run_twice(animal):
33     animal.run()
34     animal.run()
35
36 run_twice(animal)
37 run_twice(cat)
38 run_twice(dog)
39 #这里只是为了说明这个动态语言的问题
40 def NotAnimal(object):
41     def run(self):
42         print(‘I am not a animal but i can invoke runtwice() too...‘)
43 notanimal = NotAnimal()
44 run_twice(notanimal)

 

时间: 2024-08-09 19:52:00

Python面向对象的编程注意细节的相关文章

Python面向对象高级编程:@property--把方法变为属性

为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: 1 >>> class Student(object): 2 def get_score(self): 3 return self.__score 4 def set_score(self,value): 5 if not isinstance(value,int): 6 raise ValueError('sec

python面向对象高级编程

python中属性和方法的动态绑定  class Student(object):     pass   # 实例化一个对象     s = Student() # 给这个对象绑定一个属性name s.name = 'John'   print(s.name) John   # 定义一个方法 def set_age(self, age):     self.age = age   # 导入模块     from types import MethodType   #给s这个对象绑定一个set_a

Python 面向对象高级编程——使用@property

1.1   使用@property 输入成绩score时,需对这个参数进行检查. >>> class Student(object): ...    def get_score(self): ...        return self.__score ...    def set_score(self, value): ...        if not isinstance(value, int): ...             raise ValueError('score mu

Python 面向对象高级编程——定制类

1.1   定制类 1.1.1   __str__ >>> class Student(object): ...    def __init__(self, name): ...        self.name = name ... >>> s = Student('daidai') >>> s.name 'daidai' >>> Student('daidai').name 'daidai' >>> print(

Python 面向对象高级编程——使用枚举和元类

1.1   使用枚举 基于Enum类实现的枚举 >>> fromenum import Enum >>> Month = Enum('Month', ('Jan','Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) >>> for name, member inMonth.__members__.items(): ...    print(name,

Python面向对象高级编程[email protected]

使用@property 在绑定属性时,如果直接把属性暴露出去,虽然写起来简单,但是没法检查参数,导致可以把成绩随便改: >>> class Student(object): pass >>> s =Student() >>> s.score=999 >>> s.score 999 这显然不符合逻辑,为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_s

Python面向对象高级编程-_slots_

使用_slots_ 正常情况下,当定义一个class,创建一个class的实例后,可以给实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' >>> print s.name Michael 还可以尝试给实例绑定一个方法: >>>

Python 面向对象高级编程——使用__slots__

1.1   使用__slots__ 1.1.1   类方法的绑定 实例上添加方法 >>> class Student(object): ...    pass ... >>> def set_age(self, age):     #定义函数作为实例方法,注意self参数 ...    self.age = age ... >>> s = Student() >>> fromtypes import MethodType >&g

Python 面向对象高级编程——多重继承

1.1   多重继承 >>> #最大类 ... class Animal(object): ...    pass ... >>> #大类 ... class Mammal(Animal): ...    pass ... >>> class Bird(Animal): ...    pass ... >>> class Runnable(object): ...    def run(self): ...        print(