1. 定义一个类
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print('{0}的分数是{1}'.format(self.name,self.score))
print('Studebt的类型是',type(Student))
s1 = Student('万泉河',89)
s1.say_score()
print(s1.name)
2. 实例的属型
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print('{0}的分数是{1}'.format(self.name,self.score))
s1 = Student('赵雪',97)
s1.say_score()
s1.age = 19
s1.salary = 3000
print('姓名:{0},年龄{1},分数{2},薪资{3}'.format(s1.name,s1.age,s1.score,s1.salary))
'''s2 = Student()
print(s2.name)会报错TypeError: __init__() missing 2 required positional arguments: 'name' and 'score'
这说明s1和s2是两个对象'''
s2 = Student('赵雪',77)
s2.say_score()
print('s1地址{0},s2地址是{1}'.format(id(s1),id(s2)))
3 实例方法
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print('{0}的分数是{1}'.format(self.name,self.score))
s1 = Student('赵雪',97)
s1.say_score()
Student.say_score(s1)
4.实例属性和方法的其他操作
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print('{0}的分数是{1}'.format(self.name,self.score))
s1 = Student('wan',89)
print(dir(s1))
print(s1.__dict__)
class Man:
pass
print('s1是不是Student类的对象',isinstance(s1,Student))
print('s1是不是Man类的对象',isinstance(s1,Man))
5.特殊属型测试
class A:
pass
class B:
pass
class C(B, A):
def __init__(self, name):
self.name = name
s = C(3)
print('s的所有属性', dir(s))
print('s的属性字典', s.__dict__)
print('s所属的类', C.__class__)
print('s的直接父类', C.__bases__)
print('s的父类层次', C.__mro__)
print('A的子类', A.__subclasses__())
6.类对象
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print('{0}的分数是{1}'.format(self.name,self.score))
stu2 = Student
s1=Student('wan',100)
s2 = stu2('zhao',89)
s1.say_score()
s2.say_score()
7.定义类属型
class Student:
company = '九州迪飞'
count = 0
def __init__(self,name,score):
self.name = name
self.score = score
Student.count += 1
def say_score(self):
print('我们的公司是',Student.company)
print('{0}的分数是{1}'.format(self.name,self.score))
print(Student.count)
s1 = Student('wan',100)
s2 = Student('赵雪',30)
s3 = Student('liu',40)
s1.say_score()
8.类方法的定义
class Student:
count = 0
@classmethod
def company(cls):
print('这是一个类方法')
print(cls.count)
def __init__(self,name,score):
self.name = name
self.score = score
Student.count += 1
def say_score(self):
print(self.name,self.score)
Student.company()
s1 = Student('zhao',78)
s2 = Student('wan',88)
s1.say_score()
'''类方法可以调用类属性的数据,但不能调用实例对象的数据。
但是实例对象可以调用类属性和类方法
实例属性和实例方法,是依附实例对象的。只有创建了实例对象
才可调用实例属性和实例方法,这就是为什么类对象不能操做实例对象而实例对象可以操作类对对象
'''
9.类方法写向量坐标
import math
class Vector2:
def __init__(self, x=0.0, y=0.0):
self.x = x
self.y = y
def __str__(self):
return "向量(%s,%s)" % (self.x, self.y)
@classmethod
def from_point(cls, p1, p2):
return cls(p2[0]-p1[0], p2[1]-p1[1])
def norm_vector(self):
norm = math.sqrt(self.x**2 + self.y**2)
return norm
def unit_vector(self):
norm = self.norm_vector()
x = self.x / norm
y = self.y / norm
return x, y
def __add__(self, other):
if isinstance(other, Vector2):
return Vector2(self.x + other.x, self.y + other.y)
def __sub__(self, other):
if isinstance(other, Vector2):
return Vector2(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return Vector2(self.x*other, self.y*other)
A = (20, 30)
B= (2, 54)
C = (0, 0)
D = (13, 53)
print(Vector2.from_point(A, B))
print(type(Vector2.from_point(A, B)))
v1 = Vector2.from_point(A, B)
v2 = Vector2.from_point(C, D)
v3 = Vector2(40,30)
print("查看两个打出什么", v3, v1)
print("向量v1", v1)
print("向量v2", v2)
print(v1 + v2)
print(v1*4)
print("单位向量长",v2.unit_vector())
print('我要的想',v2.x,v2.y)
10.静态方法
class Student:
@staticmethod
def add(a,b):
print(a+b)
def __init__(self,a,b,c):
self.a = a
self.b = b
self.c = c
def add_print(self):
Student.add(self.a,self.b)
s1 = Student(10,20,Student.add(77,9))
s1.add_print()
s1.add(10,3)
Student.add(10,10)
11.析构方法_删除对象
class Person:
def __del__(self):
print("删除对象是{0}".format(self))
p1 =Person()
p2 = Person()
print('程序结束,自动删除对象')
12.__call__可调用对象
class SalaryAcount:
'''薪资计算'''
def __call__(self, salary):
year_salary = 12*salary
day_salary = salary//22.5
hour_salary = day_salary//8
return dict(year_salary=year_salary,
moth_salary=salary,
day_salary=day_salary,
hour_salary=hour_salary)
s = SalaryAcount()
print(s(30000))
13.方法的动态性
class Person:
def work(self):
print('努力上班')
def play_game(s):
print('{0}在打游戏'.format(s))
p = Person()
p.work()
print('********分界线****上方函数和类还是独立的***********')
print('********分界线****下方函数添加成类的实例方法***********')
Person.play = play_game
p.play()
print('********分界线****下方修改类的实例方法的***********')
def work2(w):
print("好好学习,努力上班")
Person.work = work2
p.work()
14.私有属型和私有方法
class Employee:
__name = "百战程序员"
def __init__(self, name, age):
self.name = name
self.__age = age
def __work(self):
print('努力工作,赚钱养媳妇!')
print(self.__name)
e = Employee('万泉河', 22)
print(e.name, e._Employee__age)
e._Employee__work()
print(dir(e))
print(Employee._Employee__name)
15.继承父类属型
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def say_age(self):
print('年龄,年龄')
class Student(Person):
def __init__(self, name, age, score):
Person.__init__(self, name, age)
self.score = score
s = Student('万权和', 33, 30000)
print(s.name)
print(s._Person__age)
print(dir(s))
print(Student.mro())
'''
代码格式:
1.井号注解后隔开一个空格
2.整个代码最后要空一行
3.逗号后要隔开一个空格
4.类体与类体之间隔开两行
5.方法名下不空格
6.解决:say_age()有波浪线,file - invaluedate cache/restart
'''
16.继承父类方法
class Person:
'''def __init__(self,name,age):
self.name = name
self.__age = age'''
def say_age(self):
print('年龄,年龄')
class Student(Person):
pass
s = Student()
s.say_age()
17.父类方法的重写
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def say_age(self):
print('年龄,年龄')
def introduction(self):
print('我的名字是{0}'.format(self.name))
class Student(Person):
def __init__(self, name, age, score):
Person.__init__(self, name, age)
def introduction(self):
print('报告老师,父类重写后我的名字是{0}'.format(self.name))
s = Student('万泉河', 23, 66)
s.introduction()