类
1、类的使用
class MyClass(object):
i=123
def f(self):
return 'hello,world'
test=MyClass()
print(test.i,test.f())
>>>123 hello,world
2、类的构造
class cltdy: #定义类,并命名
n=1000 #类属性,类以内的变量
def __init__(self,name,age,profession='IT民工'): #构造函数,类接受外部传入参数依赖构造函数
#self 将实例化变量名传入类中
#__init__这个方法一般用于初始化一个类,没有返回值;
self.name=name
self.age=age
self.profession=profession
def printing_name(self): #类的方法
print('我的名字:%s' % self.name)
def printing_age(self):
print('我的年龄:%s' % self.age)
def printing_pfsn(self):
print('我的职业:%s' % self.profession)
----------
test=cltdy('sober',25,'DevOps') #类的实例化,将参数传入类中,传入参数要大于等于构造函数参数
print('实例化后的内存地址:%s' % test)
test.printing_name() #调用实例化后类的方法
test.name='moon' #修改构造函数参数
test.printing_name()
test.printing_pfsn()
print(test.n)
test.n=2000 #修改类属性,只对test生效
print(test.n)
t2=cltdy('jack',22,'student')
print(t2.n)
t2.printing_age()
输出结果:
实例化后的内存地址:<__main__.cltdy object at 0x0000000002EE5710>
我的名字:sober
我的名字:moon
我的职业:DevOps
1000
2000
1000
我的年龄:22
类的访问权限(封装)
1、公有变量(通过点操作符. 来进行访问)
例: def __init__(self,name,age,profession='IT民工'):
self.name=name
self.age=age
self.profession=profession
2、私有变量(要使内部属性不被外部使用,加两个下划线__)
def __init__(self,name,age,profession='IT民工'):
self.__name=name
self.__age=age
self.__profession=profession
--将变量定义为私有变量,可以确保外部代码不能随意修改对象内部的状态,通过访问限制的保护,代码更加安全
--若在类外部直接修改私有变量的值,是不会影响到最终实例(私有)变量的值
3、在外部获取私有变量
在Python中,可以通过get_attrs方法获取类中的私有变量(定义一个get_属性名)
class cltdy:
def __init__(self,name,age,profession='IT民工'):
self.__name=name
self.__age=age
self.__profession=profession
def get_name(self):
print('我的名字:%s'%self.__name)
def get_age(self):
print('我的年龄:%s'%self.__age)
def get_pfsn(self):
return self.__profession
def set_pfsn(self,new_pfsn):
self.__profession = new_pfsn
------------------
test=cltdy('sober',25,'DevOps')
print('实例化后的内存地址:%s'%test)
test.get_name()
test.__name='moon'
print(test.__name)
test.get_name()
test.set_pfsn('测试')
print('修改后的职业',test.get_pfsn())
输出结果: 实例化后的内存地址:<__main__.cltdy object at 0x0000000002EE5668>
我的名字:sober
moon
我的名字:sober
修改后的职业 测试
4、类的私有方法(不能在类外使用)
def __printing_name(self): #类方法前面加两下划线
print('我的名字:%s' % self.name)
继承和封装
1、子类的方法__init__()
class car():
def __init__(self, make, modle, year):
self.make = make
self.modle = modle
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
long_name = str(self.year) + " " +self.make + " " + self.modle
return long_name.title()
2、继承类
(1)class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
定义Student类时,只需要把额外的属性加上,例如score:
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
(2) class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def whoAmI(self):
return 'I am a Person, my name is %s' % self.name
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def whoAmI(self):
return 'I am a Student, my name is %s' % self.name
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
def whoAmI(self):
return 'I am a Teacher, my name is %s' % self.name
def who_am_i(x):
print (whoAmI ())
p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')
who_am_i(p)
who_am_i(s)
who_am_i(t)
3、封装
第一层面封装(什么都不用做):类名.和实例名.就是访问隐藏属性的接口
第二个层面的封装: 在准备私有化的属性(包括方法、数据)名字前面加两个下划线
获取对象信息
1、type() 获取类型
type(123) <class 'int'>
type('123')==type('abc') True
2、isinstance() 明确继承关系
isinstance((1,2,3),tuple) True
isinstance((1,2,3),list) False
isinstance((1,2,3),(list,tuple)) True
3.dir() 返回一个字符串的list
dir(123)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']