python学习笔记——面向对象

1.访问限制

练习1

class Student(object):
    def __init__(self, name, gender):
        self.__name = name
        self.__gender = gender

    def get_gender(self):
        return self.__gender
        print('%s' %self.__gender)

    def set_gender(self,gender):
        if gender == 'male' or gender == 'female':
            self.__gender = gender
        else:
            raise ValueError('Please set a correct gender!')


bart = Student('Bart', 'male')
print(bart.get_gender())

bart.set_gender('female')
print(bart.get_gender())

题外话)python 里的与或非:

一般格式为:a & b    a | b      a and b     a or b

如果a,b是数值变量, 则&, |表示位运算, and,or则依据是否非0来决定输出

例如:

1 & 2 # 输出为 0, 1 | 2 # 输出为3   (# 1&2,2在二进制里面是10,1在二进制中是01,那么01与运算10得到是0)

2 and 0 # 返回0 , 2 and 1 # 返回1

2.继承与多态

python中继承与多态,我的个人理解是:
继承是子类继承父类的全部属性和方法,多态是子类对父类的方法表现多样化,如覆盖父类里的方法和添加新的方法
 
python的鸭子特性:不一定要传入父类的类型,只要保证传入的对象有要调用的方法就可以
对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了

3.获取对象信息

type()函数:

type(123) ,  type(abs) ,  type('ABC')

isinstance()函数

isinstance('a', str) , isinstance(123, int) , Isinstance([1,2,3,4,5], tuple)

dir() 函数

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:

dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
getattr() , setattr() ,  hasattr()

如:hasattr(obj, 'x')

setattr(obj, 'name', 19)

getattr(obj, 'y')

练习2:为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加

class Student(object):
    count = 0
    def __init__(self, name):
        self.name = name
        Student.count += 1

Bart = Student('Bart')
print(Bart.count)

lisa = Student('lisa')
print(lisa.count)
>>>1
>>>2

实例属性属于各个实例所有,互不干扰;

类属性属于类所有,所有实例共享一个属性;

原文地址:https://www.cnblogs.com/stacy828/p/10840171.html