Во-первых, именование Ваших споров с прописными буквами сбивает с толку. Так как Python не имеет формальной, статической проверки типа, мы используем UpperCase
, чтобы означать класс и lowerCase
означать аргумент.
Room
. Person
.
В-третьих, мы обычно не помещаем вещи в [1 125] Один Класс На формат Файла . Файл является модулем Python, и мы чаще импортируем весь модуль со всеми классами и функциями.
[я знаю, что те - привычки - Вы не должны повреждать их сегодня, но из-за них действительно сложно читать.]
Python не использует статически определенные типы как C++. При определении функции метода Вы официально не определяете тип данных аргументов той функции. Вы просто перечисляете некоторые имена переменной. Хотелось бы надеяться, клиентский класс обеспечит аргументы корректного типа.
Во время выполнения, когда Вы выполняете запрос метода, тогда Python должен быть уверен, что объект имеет метод.Примечание. Python не проверяет, чтобы видеть, является ли объект правильным типом - который не имеет значения. Это только проверяет, чтобы видеть, имеет ли это правильный метод.
цикл между room.Room
и person.Person
является проблемой. Вы не должны включать тот при определении другого.
является самым безопасным импортировать весь модуль.
Вот room.py
import person
class Room( object ):
def __init__( self ):
self.nextId= 0
self.people= {}
def addPerson(self, firstName, secondName, gender):
id= self.NextId
self.nextId += 1
thePerson = person.Person(firstName,secondName,gender,id)
self.people[id] = thePerson
return thePerson
, Хорошо работает, пока Человек в конечном счете определяется в пространстве имен, где это выполняется. Человек не должен быть известен, когда Вы определяете класс.
Человек не должен быть известен до времени выполнения, когда тогда Человек (...) выражение оценено.
Вот person.py
import room
class Person( object ):
def something( self, x, y ):
aRoom= room.Room( )
aRoom.addPerson( self.firstName, self.lastName, self.gender )
Ваш main.py
, похож на это
import room
import person
r = room.Room( ... )
r.addPerson( "some", "name", "M" )
print r
В вашем SchedulerFactoryBean также должен быть зарегистрирован "driverJob". Вместе с триггерами добавьте список jobDetails.
<bean id="job.statistics.DailyQPSValidationJobTrigger" class="org.quartz.CronTrigger">
<property name="name" value="DailyQPSValidationTrigger" />
<property name="jobName" value="DailyQPSValidation" />
<property name="jobGroup" value="Statistics" />
<property name="volatility" value="false" />
<!-- Each day, 4 o'clock AM -->
<property name="cronExpression" value="0 0 4 * * ?" />
</bean>
<!-- Scheduler -->
<bean id="job.SchedulerProperties" class="somecompany.someproduct.util.spring.PropertiesFactoryBean"
scope="singleton">
<property name="source">
<props>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.scheduler.instanceName">JobCluster</prop>
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
<prop key="org.quartz.jobStore.isClustered">true</prop>
<prop key="org.quartz.jobStore.useProperties">false</prop>
</props>
</property>
</bean>
<bean id="job.Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton"
lazy-init="false">
<property name="startupDelay" value="30" />
<property name="waitForJobsToCompleteOnShutdown" value="true" />
<property name="dataSource" ref="jdbc.DataSource" />
<property name="quartzProperties" ref="job.SchedulerProperties" />
<property name="jobDetails">
<list>
<ref bean="job.statistics.DailyQPSValidationJobDetail" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="job.statistics.DailyQPSValidationJobTrigger" />
</list>
</property>
<property name="schedulerListeners">
<list>
<bean class="somecompany.someproduct.job.SchedulerErrorListener">
<property name="monitoringService" ref="monitoring.MonitoringService" />
</bean>
</list>
</property>
<property name="globalJobListeners">
<list>
<bean class="somecompany.someproduct.job.JobErrorListener">
<property name="name" value="JobErrorListener" />
<property name="monitoringService" ref="monitoring.MonitoringService" />
</bean>
</list>
</property>
</bean>
I'm not sure if this will work, but you could try using:
<bean id="driverJob" .../>
instead of:
<bean name="driverJob" .../>